您的位置:首页 > 其它

2017.2.22 多线程访问成员变量造成的问题及改正

2018-01-04 16:38 351 查看
多线程访问成员变量造成的问题及改正

参考资料:

http://blog.csdn.net/gaogaoshan/article/details/23910355
http://blog.csdn.net/gaogaoshan/article/details/9312703
 

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的学习

http://blog.csdn.net/gaogaoshan/article/details/9312703 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: