2017.2.22 多线程访问成员变量造成的问题及改正
2017-02-23 11:13
288 查看
多线程访问成员变量造成的问题及改正
参考资料:
http://blog.csdn.net/gaogaoshan/article/details/23910355
http://blog.csdn.net/gaogaoshan/article/details/9312703
1 项目中的问题
项目中出现了一个问题,当多个线程访问时,AuthPermissionResolver出现了多线程问题,导致偶发"无权限"的缺陷。
错误原因:成员变量permissionString没有做多线程处理。
修改前的代码:
修改后的代码:
如果一个变量是成员变量:
那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。(所以改前的代码有问题)
如果一个变量是局部变量:
那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方法的局部变量,也会对每一个线程有一个拷贝),一个线程对该局部变量的改变不会影响到其他线程。
2 ThreadLocal的学习
http://blog.csdn.net/gaogaoshan/article/details/9312703
参考资料:
http://blog.csdn.net/gaogaoshan/article/details/23910355
http://blog.csdn.net/gaogaoshan/article/details/9312703
1 项目中的问题
项目中出现了一个问题,当多个线程访问时,AuthPermissionResolver出现了多线程问题,导致偶发"无权限"的缺陷。
错误原因:成员变量permissionString没有做多线程处理。
修改前的代码:
public class AuthPermissionResolver extends WildcardPermissionResolver { private String permissionString; public String getPermissionString() { return permissionString; } public void setPermissionString(String permissionString) { this.permissionString = permissionString; } @Override public Permission resolvePermission(String permissionString) { setPermissionString(permissionString); return super.resolvePermission(permissionString); } }
修改后的代码:
public class AuthPermissionResolver extends WildcardPermissionResolver { private ThreadLocal<String> permissionString = new ThreadLocal<>(); public String getPermissionString() { return this.permissionString.get(); } public void setPermissionString(String permissionString) { this.permissionString.set(permissionString); } @Override public Permission resolvePermission(String permissionString) { setPermissionString(permissionString); return super.resolvePermission(permissionString); } }
如果一个变量是成员变量:
那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。(所以改前的代码有问题)
如果一个变量是局部变量:
那么每个线程都会有一个该局部变量的拷贝(即便是同一个对象中的方法的局部变量,也会对每一个线程有一个拷贝),一个线程对该局部变量的改变不会影响到其他线程。
2 ThreadLocal的学习
http://blog.csdn.net/gaogaoshan/article/details/9312703
相关文章推荐
- 2017.2.22 多线程访问成员变量造成的问题及改正
- PHP 类的变量与成员,及其继承、访问与重写要注意的问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- PHP类的变量与成员,及其继承、访问与重写要注意的问题
- Java多线程访问成员变量与局部变量
- Java 多线程(四) 多线程访问成员变量与局部变量
- Java 多线程(四) 多线程访问成员变量与局部变量
- java多线程访问同一变量及简单同步问题(待后续整理)
- C语言中结构体偏移及结构体成员变量访问方式的问题讨论
- iava多线程详解(2)-成员变量与局部变量访问
- 多线程访问成员变量与局部变量
- C++中静态成员函数访问成员变量问题
- Java: 简单模拟多线程访问同样变量导致的问题
- C++中线程函数中方访问成员变量的问题
- 关于空指针类型的类变量的成员函数访问的问题
- C++中静态成员函数访问成员变量问题
- Java 多线程访问成员变量与局部变量
- Java 多线程(四) 多线程访问成员变量与局部变量
- Java 多线程(四) 多线程访问成员变量与局部变量
- Java 多线程(四) 多线程访问成员变量与局部变量