synchronized

synchronized是Java控制多线程同步的,其实现是基于锁。

一 锁机制有两种特性

1. 互斥性

在同一时间内,一个对象锁只允许一个线程持有。互斥性往往也称为操作的原子性。

2. 可见性

在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的。

 

二 synchronized用法

1. 加在方法前面,用于同步方法

既可以同步静态方法,也可以同步非静态方法。

 

底层原理:设置ACC_SYNCHRONIZED标识

2. 加在代码块上

synchronized(this|object) {}

synchronized(类.class) {}

 

底层原理:对象加锁

在 Java 中,每个对象都有一个 monitor 对象,monitor对象中有一个计数器。

  • 某一线程占有这个对象的时候,先检查monitor的计数器是不是0,如果是0则表示还没有线程占有,这个线程就可以占有这个对象,并且对这个对象的monitor+1;如果不为0,表示这个线程已经被其他线程占有,这个线程等待。当线程释放占有权的时候,monitor-1;
  • 同一线程可以对同一对象进行多次加锁,+1(具有重入性)

 

在JDK1.6之前synchronized使用重量级锁。JDK1.6开始做了优化,对锁根据条件逐步升级:偏向锁-》轻量级锁-》重量级锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值