011 深入理解synchronized

一 .概述

在前面我们使用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在后面引入了偏向锁,自旋锁来改进互斥锁, 

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

猜你喜欢

转载自www.cnblogs.com/trekxu/p/8976794.html
011
今日推荐