码迷,mamicode.com
首页 > 其他好文 > 详细

synchronized

时间:2019-12-29 20:22:10      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:实现原理   介绍   内存   问题   完数   sync   两种   mic   分类   

一、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

标签:实现原理   介绍   内存   问题   完数   sync   两种   mic   分类   

原文地址:https://www.cnblogs.com/linlf03/p/12115973.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!