锁:Sychronized、Lock

本文介绍了Java并发编程中的锁机制,包括synchronized关键字和Lock接口。synchronized提供对象锁和类锁,通过monitorenter/monitorexit指令实现。Lock接口则更灵活,需要配合Condition使用,如ReentrantLock实现了公平锁和非公平锁。Lock提供了更多的控制,如可判断锁状态、手动释放锁并能精确唤醒线程。
摘要由CSDN通过智能技术生成

锁是用来在多线程并发阶段保障数据同步的重要手段,防止出现脏数据,加锁代码在某个时间点只能由一个线程运行,其他线程等待。

普遍熟知的锁是synchronized关键字和Lock类。

一、synchronized关键字

这个在同步中是最常用的,分成对象锁和类锁,可以对方法和代码块进行加锁。

1、对象锁,锁住的是对象,用于
synchronized(this){}
synchronized(Object){}
2、类锁,锁住的是该类的所有实例  
synchronized(Object.class){}

synchronized锁是在字节码级别上的锁,可以用javap(java自带的反编译工具)查看

例如查看这一段代码的字节码指令

 

javap执行结果如下:

 

可以看到是由monitorenter和monitorexit指令来实现加锁的,出现两次的monitorexit是为了确保解锁完成。

二、Lock

Lock是接口,有以下几个方法

1、获取锁
lock()
2、获取锁,除非线程中断
lockInterruptibly()
3、尝试获取锁,在锁可用获取锁
tryLock()
4、解锁
unlock()
5、返回该Lock的condition
newCondition()

Lock是需要配合Condition使用的,其有await和signal方法,类似于Object的wait和notify方法。

主要看一下Lock的实现类ReentrantLock。

(1)ReentrantLock默认是非公平锁(获取锁的顺序不是按照申请顺序来)

public ReentrantLock() {    sync = new NonfairSync();}

也可以用参数指定是公平锁OR非公平锁

public ReentrantLock(boolean fair) {    sync = fair ? new FairSync() : new NonfairSync();}

FairSync和NonFairSync是继承Sync的,而Sync是继承自AbstractQueuedSynchronizerÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值