synchronized原理

1.作用
synchronized是java提供的一种最基本的锁,可重入的非公平锁,主要用在多线程并发中,当要求某种操作在同一时间只能由一个线程处理时,就需要加锁,否则就会造成数据的错乱。
2.锁类型
synchronized可用在static代码块,静态方法,实例方法以及方法块中,不同的地方所用的锁是不一样的。


3.实现的原理


public class SynTest {
    private final Object lock = new Object();
    private int a = 1;

    public void test() {
        synchronized (lock) {
            a++;
        }
    }
}

以这段简单的代码为例,我们用任意实例对象Object来加的锁,编译成.class文件后,我们再看一下代码(比较多,只截取了重要的部分):

    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L2 L3 L2 null
   L4
    LINENUMBER 8 L4
    ALOAD 0
    GETFIELD com/game/xiangxuemytest/thread/SynTest.lock : Ljava/lang/Object;
    DUP
    ASTORE 1
    MONITORENTER
   L0
    LINENUMBER 9 L0
    ALOAD 0
    DUP
    GETFIELD com/game/xiangxuemytest/thread/SynTest.a : I
    ICONST_1
    IADD
    PUTFIELD com/game/xiangxuemytest/thread/SynTest.a : I
   L5
    LINENUMBER 10 L5
    ALOAD 1
    MONITOREXIT

在编译后的代码中可以看到 ** MONITORENTER,MONITOREXIT**,两个指令,这两个指令就是同步的关键。当线程执行代码前,需要先执行monitorEnter,哪个线程获取了monitor对象,便可执行代码,否则线程会进入阻塞状态。当代码运行完成后,会执行monitorExit,将对象释放。
注意:synchronized是一种可重入锁。

4.锁的状态
锁在哪里:在同步的时候是获取对象的monitor,即获取到对象的锁。那么对象的锁怎么理解?无非就是类似对对象的一个标志,那么这个标志就是存放在Java对象的对象头。Java对象头里的Mark Word里默认的存放的对象的Hashcode,分代年龄和锁标记位。32为JVM Mark Word默认存储结构为(注:摘自《java并发编程的艺术》):

锁的状态:在jdk1.5之前,synchronized在实现上是一种很重的锁,会导致线程的阻塞;在1.5及之后,将其做了优化,将锁的状态分成了4类:无锁、偏向锁、轻量级锁、重量级锁,这几个状态会随着锁的竞争,逐步升级,锁可以升级但不能降级,也就意味着一旦升级后,即可不存在竞争了,那锁也无法降级了。对象的MarkWord变化为下图


偏向锁:HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。
    当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,当此线程来获取对象锁时,只需简单地测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁,如果通过了,此线程就会执行代码,如果没通过,则锁存在着线程竞争,则升级为轻量级锁。
轻量级锁:线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word。当有线程来获取锁时,会尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。当自旋达到一定次数时依然未得到锁时,说明线程竞争比较多,该轻量级锁就会升级为重量级锁。
重量级锁:也就是jdk1.5之前的实现方式了,当有线程竞争锁失败时,会进入阻塞状态,而这中间上下文的切换,会加大cpu的开销。

5.锁的比较

锁的比较

参考://www.greatytc.com/p/d53bf830fa09

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355