陕西高端品牌网站建设,苏州市城乡建设局网站,深圳建筑公司排行榜,wordpress 调用页面内容目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时#xff0c;使用读写锁让读读可以并发#xff0c;来提高… 目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时使用读写锁让读读可以并发来提高性能 2.类似于数据库中的select … from … lock in share mode 3.提供一个数据容器类内部分别使用读锁保护数据的read()方法写锁保护数据的write()方法
二、读读不互斥
2.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;Slf4j
public class ReadWriteLockLearning {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock reentrantReadWriteLock.writeLock();public Object read(){log.debug(获取读锁);readLock.lock();try {log.debug(读取);try {Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}return data;}finally {log.debug(释放读锁);readLock.unlock();}}public void write(){log.debug(获取写锁);writeLock.lock();try{log.debug(写入);}finally {log.debug(释放写锁);writeLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning readWriteLockLearning new ReadWriteLockLearning();new Thread(()-{readWriteLockLearning.read();}, t1).start();new Thread(()-{readWriteLockLearning.read();}, t2).start();}
}
2.2 截图示例 三、读写互斥
3.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;Slf4j
public class ReadWriteLockLearning {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock reentrantReadWriteLock.writeLock();public Object read(){log.debug(获取读锁);readLock.lock();try {log.debug(读取);return data;}finally {log.debug(释放读锁);readLock.unlock();}}public void write(){log.debug(获取写锁);writeLock.lock();try{log.debug(写入);try {Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}finally {log.debug(释放写锁);writeLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning readWriteLockLearning new ReadWriteLockLearning();new Thread(()-{readWriteLockLearning.read();}, t1).start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()-{readWriteLockLearning.write();}, t2).start();}
}
3.2 截图示例 四、写写互斥
4.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;Slf4j
public class ReadWriteLockLearning {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock reentrantReadWriteLock.writeLock();public Object read(){log.debug(获取读锁);readLock.lock();try {log.debug(读取);return data;}finally {log.debug(释放读锁);readLock.unlock();}}public void write(){log.debug(获取写锁);writeLock.lock();try{log.debug(写入);try {Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}finally {log.debug(释放写锁);writeLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning readWriteLockLearning new ReadWriteLockLearning();new Thread(()-{readWriteLockLearning.write();}, t1).start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()-{readWriteLockLearning.write();}, t2).start();}
}
4.2 截图示例 五、注意事项
1.读写不支持条件变量2.不支持重入时升级持有读锁的情况下去获取写锁会导致获取写锁永久等待
5.2.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;Slf4j
public class ReadWriteLockLearning2 {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock reentrantReadWriteLock.writeLock();public void readWrite(){log.debug(获取读锁);readLock.lock();try {try{log.debug(获取写锁);writeLock.lock();}finally {log.debug(释放写锁);writeLock.unlock();}}finally {log.debug(释放读锁);readLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning2 readWriteLockLearning new ReadWriteLockLearning2();readWriteLockLearning.readWrite();}
}
5.2.2 截图示例 3.支持重入时降级持有写锁的情况下去获取读锁