011 深入理解synchronized

Posted trekxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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在后面引入了偏向锁,自旋锁来改进互斥锁, 

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

 

以上是关于011 深入理解synchronized的主要内容,如果未能解决你的问题,请参考以下文章

深入理解synchronize

深入理解Java中的同步静态方法和synchronized(class)代码块的类锁

深入理解使用synchronized同步方法和同步代码块的区别

深入理解Java中的synchronized锁重入

深入理解多线程——Synchronized的实现原理

深入理解 synchronized 关键字