我是靠谱客的博主 成就月饼,最近开发中收集的这篇文章主要介绍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。

折腾了老半天,最后还是同学实验了下告诉我,主线程睡眠时间太短,其它线程还没执行完毕就开始读,,,,晕了,自己已经考虑过这种情况,没想到时间设置太短了。但是另外两种锁却能输出正确结果,难道是另外两种锁效率更高,主线程睡眠时间够了???

最后

以上就是成就月饼为你收集整理的JAVA多线程synchronized关键字不起作用的全部内容,希望文章能够帮你解决JAVA多线程synchronized关键字不起作用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部