首先,第一个想到的是synchroniized
关键字,它主要有以下几种用法:
- 非静态方法的同步
- 静态方法的同步
- 代码块
常见的使用场景有对象锁和类锁。Java中synchronized同步锁用法及作用范围
总结:
在JVM
层面实现的。
在对象锁可以通过对非静态方法使用synchronized
或者代码块synchronized(this){}
。其次就是,当某进程获取到了对象锁后,该对象的其他同步方法也是锁定的,但不影响非同步方法的调用。这个可以在上面的参考文章中找到示例,这里就不再展示了。
当资源竞争不是很激烈的情况下,synchronized
性能优于ReentrantLock
。资源竞争很激烈时,synchronized
的性能会下降几十倍。
类锁可以通过对静态方法使用synchronized
或者代码块synchronized(xx.class){}
。其机制与对象锁是一致的,不过对象锁和类锁又是相互独立的,这个也可以在上面的参考文章中找出对应的实例去验证。
除了synchroniized
,还有Lock
也可以实现线程同步,Lock
是Java 1.6
被引入进来的,Lock
的引入让锁有了可操作性。使我们可以在需要的时候去手动的获取锁和释放锁,甚至我们还可以中断获取以及超时获取的同步特性,但是它在使用上没有synchroniized
方便快捷。
Lock
是一个接口(JDK 1.6引入
),我们常用的实现类有ReentrantLock
(可重入锁)、ReadLock
和WriteLock
,最常用的还是ReentrantLock
总结:lock
如果拿不到锁(对象锁)就会一致处于等待状态,直到拿到锁,tryLock
如果拿不到锁则会返回false
停止等待。tryLock
有一个重载方法:tryLock(long timeout, TimeUnit unit)
。注意记得在finally
中unLock()
,手动释放锁。
有关两种方式的示例:5个步骤,教你瞬间明白线程和线程安全
网友评论