zoukankan      html  css  js  c++  java
  • [转]关于ReentrantLock中线程读某个变量是否需要加锁

    我在使用ReentrantLock类对变量进行多线程累加时,调用了lock()和unlock()方法,但读取该变量时我未加锁,结果是能正确执行,代码如下: 

    Java代码  收藏代码
    1. public class Main {  
    2.     private long count;  
    3.     private ExecutorService pool;  
    4.     private Lock lock = new ReentrantLock();  
    5.   
    6.     /** 
    7.      * @param args 
    8.      */  
    9.     public static void main(String[] args) {  
    10.         new Main().countThread();  
    11.     }  
    12.   
    13.     public Main() {  
    14.         pool = Executors.newFixedThreadPool(50);  
    15.     }  
    16.   
    17.     public void countThread() {  
    18.         for (int i = 0; i < 3000; i++) {  
    19.             pool.execute(new Runnable() {  
    20.                 @Override  
    21.                 public void run() {  
    22.                     lock.lock();  
    23.                     try {  
    24.                         count++;  
    25.                     } catch (Exception e) {  
    26.                         e.printStackTrace();  
    27.                     } finally {  
    28.                         lock.unlock();  
    29.                     }  
    30.                 }  
    31.             });  
    32.         }  
    33.         while (true) {  
    34.             System.out.println(count);  
    35.             if (count == 3000) {  
    36.                 break;  
    37.             }  
    38.         }  
    39.           
    40.         System.out.println(count);  
    41.         pool.shutdown();  
    42.     }  
    43. }  


    http://www.infoq.com/cn/articles/java-memory-model-1 
    这篇文章介绍了Java内存模型定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。 
    能不能这样理解,类中的全局变量是存储在主内存。也就是读操作不需要锁,不知道理解是否正确。

    合理解释:

    主存的变量,线程的本地内存会有一个副本这没错.可是两者有一个同步时机的问题,所以你这样用是不安全的.

    要么两边都同步保护,要么你增加"volatile"关键字提示这个变量不能创建本地副本.

  • 相关阅读:
    开发中的问题
    页面重定向Redirect时产生错误
    项目管理的几个阶段及分工
    让你的CSS像Jquery一样做筛选
    项目中的几个SQL程序
    SharePoint2010人员搜索配置心得
    TroubleShoot:该搜索请求无法连接到搜索服务
    转:软件架构师应该知道的97件事
    通用动态生成静态HTML页方法
    简单的正则表达式过滤网址
  • 原文地址:https://www.cnblogs.com/sidesky/p/6958156.html
Copyright © 2011-2022 走看看