今天在使用synchronized关键字来实现共享变量线程安全时,结果不起作用(自己犯了小错误。。。)。这实在有点颠覆我的三观,先贴上代码:
public class VolatileTest {//volatile关键字不能保证遍历的线程安全性 // Object o = new Object();//线程不安全?? public volatile int counts = 0; //ReentrantLock lock = new ReentrantLock(); public synchronized void inc(){ try { Thread.sleep(1); }catch (Exception e) { } this.counts++; /* synchronized (this) { this.counts++; }*/ /* lock.lock(); counts++; lock.unlock();*/ } public static void main(String[] args) throws Exception{ VolatileTest v = new VolatileTest(); for (int i = 0; i < 1000; i++) new Thread(){ @Override public void run() { v.inc(); //System.out.println(v.counts); } }.start(); Thread.sleep(1000); System.out.println(v.counts); } }按照我的想法,这应该是一个线程安全的呀,,,结果应该输出为1000,但是,输出总是小于1000。难道是出现了bug,,,,然后又尝试了锁住this关键字和加显示锁,这两种方法都能够输出正确的结果1000。
折腾了老半天,最后还是同学实验了下告诉我,主线程睡眠时间太短,其它线程还没执行完毕就开始读,,,,晕了,自己已经考虑过这种情况,没想到时间设置太短了。但是另外两种锁却能输出正确结果,难道是另外两种锁效率更高,主线程睡眠时间够了???
