美文网首页
锁的几种写法的区别

锁的几种写法的区别

作者: 慕尼黑凌晨四点 | 来源:发表于2020-10-24 15:30 被阅读0次
    Snipaste_2020-10-24_11-36-20.png

    测试代码

    public class Test {
        static int m = 0;
    
        public static void main(String[] args) throws InterruptedException {
    
            Thread[] threads = new Thread[10];
    
            for (int i = 0; i < threads.length; i++){
                threads[i] = new Thread(new Runnable() {
                    public void run() {
                        for (int i = 0; i < 10000; i++) m++;
                    }
                });
            }
    
            for (Thread t :threads) t.start();
            for (Thread t :threads) t.join();//等待线程结束
    
            System.out.println(m);//运行结果:大概率小于10000
        }
    
    }
    

    很经典的一个代码,就开辟10个线程对m进行++操作,由于m++不具有原子性,不加锁的话大概率得到的结果小于10000。现在用它来判断这个锁加成功了没有。【运行结果为10000证明是我们想要的锁效果】。

    • 现在用这三个方法加锁:锁非静态变量锁this锁非静态方法
    锁非静态方法 锁非静态变量 锁this
    image-锁非静态方法.png image-锁非静态变量.png image-锁this.png

    运行后可以看到结果都小于10000 ,证明这个只对对象/方法所在线程生效。

    • 同理,用静态方法静态变量当前类(Test.class)加锁的话
    锁静态方法 锁静态变量 锁Test.class
    锁静态方法 静态变量 锁Test.class.png

    会发现结果是恒为10000的,即在多个线程内是共享生效的。

    证明的首图的正确性。

    另一个例子请看:https://www.cnblogs.com/fengzheng/p/12066239.html

    相关文章

      网友评论

          本文标题:锁的几种写法的区别

          本文链接:https://www.haomeiwen.com/subject/pwvimktx.html