码迷,mamicode.com
首页 > 其他好文 > 详细

011 深入理解synchronized

时间:2018-05-01 20:37:40      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:oid   互斥锁   概述   JD   public   释放   关键词   count   静态   

一 .概述

在前面我们使用synchronized完成了一个原子方法的实现.现在我们需要深入的理解这个关键词.


 

二 . 使用方式

  对于这个关键词我们的使用方式有四种:

  [1]修饰普通方法

  [2]修饰静态方法

  [3]对实例对象加互斥锁

  [4]对类对象加互斥锁

我们首先需要知道的就是synchronized就是使用互斥锁的方式完成线程的同步,

    原理就是对于临界资源的操作保持互斥.


 

三 . 实现方式

public synchronized void add1() {
            count ++;
        }
        
        public static void add2() {
            count ++;
        }
        
        public void add3() {
            synchronized (this) {
                count ++ ;
            }
        }
        
        public static void  add4() {
            synchronized (Test.class) {
                count ++;
                
            }
        }

上面的代码之中,我们分别将synchronized关键词放在了不同的地方使用,看起来使用的情况是比较复杂的.

  但是总结一些:

    synchronized就是完成了互斥锁的概念,获取到了锁的线程可以运行,其它没有获取锁的线程如抢不到锁就进入

      block队列之中.

  那么:synchronized关键词修饰实例方法就相当于是用当前调用方法的对象作为互斥锁.

    修饰的静态方法就相当于拿到class字节码作为互斥锁.


 

四 . 限制

  synchronized关键词代表的互斥锁的限制比较大,

    一旦一个线程由于抢夺锁失败就会进入阻塞队列之中,需要等待锁被重新释放.

      如果那个抢占锁的线程运行的时间很长,那么互斥锁的代价就太高了.

        因此JDK在后面引入了偏向锁,自旋锁来改进互斥锁, 

          但是他们本质上都是互斥锁,因此这个关键词代表的互斥锁是一种重量级别的锁.

 

011 深入理解synchronized

标签:oid   互斥锁   概述   JD   public   释放   关键词   count   静态   

原文地址:https://www.cnblogs.com/trekxu/p/8976794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!