synchronized
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:
- 普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
- 静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
- 同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁有JVM实现,用户不需要显式的释放锁,非常方便,然而synchronized也有一定的局限性
例如:
1、当线程尝试获取锁的时候,如果获取不到锁就会一直阻塞。
2、如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试获取锁会一直等待。
JDK1.5之后发布的concurrent包,提供了Lock接口,用来提供更多扩展的加锁功能。Lock弥补了synchronized的局限性,提供了更加细粒度的加锁功能。
ReentrantLock
JDK1.5之后发布的concurrent包,提供了Lock接口,用来提供更多扩展的加锁功能。Lock弥补了synchronized的局限性,提供了更加细粒度的加锁功能。
ReentrantLock是Lock的默认实现之一。
1、可重入锁:可重入锁是指一个线程可以多次获取同一把锁。ReentrantLock和Synchronized都是可重入锁。
2、可中断锁:可中断锁是指线程尝试获取锁的过程是否可以响应终端。synchronized是不可中断锁,而ReentrantLock则提供了中断功能。
3、公平锁与非公平锁:公平所指多个线程同时尝试获取同一把锁时,获取锁的顺序按照线程达到的顺序,而非公平锁则允许线程“插队”。synchronized是非公平锁,而ReentrantLock的默认实现是非公平锁,但是也可以设置为公平锁。
ReadWriteLock
ReadWriteLock,读写锁。
ReentrantReadWriteLock 是 ReadWriteLock 的一种实现。
特点:
- 包含一个 ReadLock 和 一个 WriteLock 对象
- 读锁与读锁不互斥;读锁与写锁,写锁与写锁互斥
- 适合对共享资源有读和写操作,写操作很少,读操作频繁的场景
- 可以从写锁降级到读锁。获取写锁->获取读锁->释放写锁
- 无法从读锁升级到写锁
- 读写锁支持中断
- 写锁支持Condition;读锁不支持Condition
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏