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的主要内容,如果未能解决你的问题,请参考以下文章