我在使用ReentrantLock类对变量进行多线程累加时,调用了lock()和unlock()方法,但读取该变量时我未加锁,结果是能正确执行,代码如下:
- 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"关键字提示这个变量不能创建本地副本.