多线程访问成员变量造成的问题及改正
参考资料:
1 项目中的问题
项目中出现了一个问题,当多个线程访问时,AuthPermissionResolver出现了多线程问题,导致偶发"无权限"的缺陷。
错误原因:成员变量permissionString没有做多线程处理。
修改前的代码:
1 public class AuthPermissionResolver extends WildcardPermissionResolver { 2 3 private String permissionString; 4 5 public String getPermissionString() { 6 return permissionString; 7 } 8 9 public void setPermissionString(String permissionString) { 10 this.permissionString = permissionString; 11 } 12 13 @Override 14 public Permission resolvePermission(String permissionString) { 15 setPermissionString(permissionString); 16 return super.resolvePermission(permissionString); 17 } 18 }
修改后的代码:
1 public class AuthPermissionResolver extends WildcardPermissionResolver { 2 3 private ThreadLocal<String> permissionString = new ThreadLocal<>(); 4 5 public String getPermissionString() { 6 return this.permissionString.get(); 7 } 8 9 public void setPermissionString(String permissionString) { 10 this.permissionString.set(permissionString); 11 } 12 13 @Override 14 public Permission resolvePermission(String permissionString) { 15 setPermissionString(permissionString); 16 return super.resolvePermission(permissionString); 17 } 18 }
如果一个变量是成员变量:
那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。(所以改前的代码有问题)
如果一个变量是局部变量:
那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方法的局部变量,也会对每一个线程有一个拷贝),一个线程对该局部变量的改变不会影响到其他线程。
2 ThreadLocal的学习