JAVA多线程synchronized关键字不起作用
今天在使用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。
折腾了老半天,最后还是同学实验了下告诉我,主线程睡眠时间太短,其它线程还没执行完毕就开始读,,,,晕了,自己已经考虑过这种情况,没想到时间设置太短了。但是另外两种锁却能输出正确结果,难道是另外两种锁效率更高,主线程睡眠时间够了???
作者:LMRzero
来源链接:https://blog.csdn.net/qq_16669583/article/details/90488269
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。