概述
今天在使用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。
折腾了老半天,最后还是同学实验了下告诉我,主线程睡眠时间太短,其它线程还没执行完毕就开始读,,,,晕了,自己已经考虑过这种情况,没想到时间设置太短了。但是另外两种锁却能输出正确结果,难道是另外两种锁效率更高,主线程睡眠时间够了???
最后
以上就是成就月饼为你收集整理的JAVA多线程synchronized关键字不起作用的全部内容,希望文章能够帮你解决JAVA多线程synchronized关键字不起作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复