ReentrantReadWriteLock_读写锁
读写锁的核心是实现读与写的分离,在高并发的情况下,尤其是读多写少的情况下,性能要远高于重入锁.对于Synchronize,ReentrantLock时,同一个时间内,只能由一个线程进行访问被锁定的代码,而读写锁则不同,其本质是分成两个锁,即读锁和写锁. 在读锁下,多个线程可以并发的进行访问,但是在写锁的时候,只能一个个的顺序访问.
读读共享,写写互斥,读写互斥
一、读写锁代码示例
public class UseReentrantReadWriteLock {
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private ReadLock readLock = rwLock.readLock();
private WriteLock writeLock = rwLock.writeLock();
public void read(){
try {
readLock.lock();
System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");
Thread.sleep(3000);
System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}
public void write(){
try {
writeLock.lock();
System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");
Thread.sleep(3000);
System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
public static void main(String[] args) {
final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
urrw.read();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
urrw.read();
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
urrw.write();
}
}, "t3");
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
urrw.write();
}
}, "t4");
// t1.start();
// t2.start();
// t1.start(); // R
// t3.start(); // W
t3.start();
t4.start();
}
}
一、锁的优化
1.避免死锁
2.减少锁的持有时间
3.减少锁的粒度
4.锁的分离
5.尽量使用无锁的操作,如:原子操作(Automic系列类),volatile关键字
还没有评论,来说两句吧...