当前位置:首页 > Java技术 > JAVA多线程synchronized关键字不起作用

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),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/java/68501.html

分享给朋友: