synchronized

Posted linlf03

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized相关的知识,希望对你有一定的参考价值。

一、synchronized介绍

线程安全问题的主要诱因

  存在共享数据(也称临界资源)

  存在多条线程共同操作这些数据

 

解决问题的根本方法:

  同一时刻有且只有一个线程操作共享数据,其它线程必须等待该线程处理完数据后再对共享数据进行操作。

 

互斥锁的特性

互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步的代码块(复合操作)进行访问。互斥性也称操作的原子性。

可见性:必须确保在锁被释放之前,对共享变量所做的修改,对应随后获得该锁的另一个线程是可见的(即获得锁的同时应获得最新共享变量的值),否则另一个线程可能是在本地缓存某个副本上继续操作,从而引起不一致。

synchronized锁的不是代码,锁的都是对象。

 

根据获取锁的分类: 获取对象锁和获取类锁

获取对象锁的两种用法

1、同步代码块( synchronized(this),  synchronized(类实例对象) ),锁是括号() 中的实例对象。

2、同步非静态方法( synchronized method) ,锁是当前对象的实例对象

 

获取类锁的两种用法

1、同步代码块(synchronized(类.class)), 锁的是小括号()中的类对象(Class对象).

2、同步静态方法 (synchronized static method ) , 锁是当前对象的类对象 (Class对象)

 

二、synchronized底层实现原理

 

实现synchronized基础

Java对象头

Monitor

 

对象在内存中的布局

对象头

实例数据

对齐填充

 

对象头的结构

技术图片

 

 

Mark Word

技术图片

 

 

Monitor: 每个Java对象天生自带了一把看不见的锁

进入源码: http://hg.openjdk.java.net/jdk8u/hs-dev/hotspot/file/ae5624088d86/src/share/vm/runtime/objectMonitor.hpp

可以发现里面有两个队列 _WaitSet 和 _EntryList

技术图片

 

 _owner 指向持有objectMonitor的线程

 

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

锁之synchronized

synchronized

Synchronized

synchronized

关键字: synchronized详解

JAVA锁