您的位置:首页 > 其它

[转]关于ReentrantLock中线程读某个变量是否需要加锁

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

Java代码


public class Main {

private long count;

private ExecutorService pool;

private Lock lock = new ReentrantLock();

/**

* @param args

*/

public static void main(String[] args) {

new Main().countThread();

}

public Main() {

pool = Executors.newFixedThreadPool(50);

}

public void countThread() {

for (int i = 0; i < 3000; i++) {

pool.execute(new Runnable() {

@Override

public void run() {

lock.lock();

try {

count++;

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

});

}

while (true) {

System.out.println(count);

if (count == 3000) {

break;

}

}

System.out.println(count);

pool.shutdown();

}

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

合理解释:

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

要么两边都同步保护,要么你增加"volatile"关键字提示这个变量不能创建本地副本.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: