synchronized的使用

一.synchronized

1.synchronized的使用

    synchronized的使用可以保证他所修饰部分代码的原子性,即同时只能被一个线程执行。

修饰方法(非静态)

public synchronized void method(){
	// todo
}

修饰代码块

public void method(){
	// 业务代码
	sychronized(this){
		// 需要同步的逻辑
	}
}

前两者都属于对象锁,锁的是当前对象,也就是说如果有多个线程调用同一个对象的同步方法时是同步的。

修饰静态方法

public static sychronized void method(){
	//需要同步的逻辑
}

静态方法是不需要new出一个对象来执行方法的,这种写法相当于下面sychronized(T.class),锁的是T.class的对象。

修饰类

sychronized(T.class){
	//需要同步的逻辑
}

2. jvm对synchronized的实现和优化

jdk早期对synchronized的实现是重量级的,是直接去找操作系统申请资源,效率就会很低。
sychronized优化的过程包括偏向锁–>自旋锁–>重量级锁
第一个访问该锁的线程ID会在对象头记录,之后如果还是同一线程的话也是直接访问锁,实际情况是并没有给对象加锁,只是记录了线程ID(偏向锁)。直到第二个线程ID过来,出现了线程竞争的时候,线程自旋(不断循环是否获得锁的过程,自旋锁),一般当自旋次数达到十次的时候,升级为重量级锁
自旋锁:加锁代码执行时间短,线程数少时使用。
重量级锁:执行时间长,线程数多时使用。

3.synchronized的一些特性

同步非同步方法可以同时调用

也可以保证可见性

可重入

异常会释放锁

synchronized实现消费生产模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值