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


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

    参考资料:

    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 

  • 相关阅读:
    CodeSmith入门教程
    AJAX调用实例
    药品监控增加表结构
    典型SQL 语句总结
    CRM中常用代码
    win2000sever+IIS5不能下载exe文件处理方法
    常用的文件对应的MIME类型
    数据库范式1NF 2NF 3NF BCNF
    多线程编程中如何更改UI值
    NHibernate学习笔记(2)—关系映射
  • 原文地址:https://www.cnblogs.com/lyh421/p/6432571.html
Copyright © 2020-2023  润新知