如何做网站海报,安徽六安市地图位置,博客网站需求分析,北京宣传片制作公司文章目录 #x1f6f8;情景引入⭐解决问题 readLock()和writeLock()都是ReadWriteLock接口中定义的方法#xff0c;用于获取读锁和写锁。 readLock()方法返回一个读锁#xff0c;允许多个线程同时获取该锁#xff0c;以进行并发读取操作。如果当前已有一个写锁或其他线程正… 文章目录 情景引入⭐解决问题 readLock()和writeLock()都是ReadWriteLock接口中定义的方法用于获取读锁和写锁。 readLock()方法返回一个读锁允许多个线程同时获取该锁以进行并发读取操作。如果当前已有一个写锁或其他线程正在请求写锁则读锁会被阻塞直到所有写锁请求完成并释放锁为止。读锁和写锁之间是互斥的。
writeLock()方法返回一个写锁只允许一个线程获取该锁以进行写入操作。如果当前已有一个读锁或其他线程正在请求读锁则写锁会被阻塞直到所有读锁请求完成并释放锁为止。写锁是独占的同一时间只能有一个线程持有写锁。
在使用读写锁时应该根据具体的业务场景和需求选择适当的锁类型。如果共享资源的读取操作远远超过写入操作那么使用读写锁可以提高系统的并发性能。如果写入操作非常频繁那么使用读写锁可能会导致读取操作的性能下降因为读取线程需要等待写入线程释放写锁。此外读写锁也需要消耗额外的系统资源因此应该避免不必要的锁竞争。
情景引入
我们先看下面这段代码
本来应该是1写入然后1写入完全 但是现在1写入后紧跟着的是3写入 这明显是错误的
⭐解决问题
下面我们来加上锁解决问题
package org.Test6;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockDemo {public static void main(String[] args) {MyCacheLock myCache new MyCacheLock();//写入for(int i1;i5;i){final int tempi;new Thread(()-{myCache.put(temp,temp);},String.valueOf(i)).start();}//读取for(int i1;i5;i){final int tempi;new Thread(()-{myCache.get(temp);},String.valueOf(i)).start();}}
}//自定义缓存
class MyCacheLock{private volatile MapString,Object map new HashMap();private ReadWriteLock readWriteLock new ReentrantReadWriteLock();//存 写 写入的时候// 只希望只有一个线程去写public void put(String key,Object value){readWriteLock.writeLock().lock(); //加锁try {System.out.println(Thread.currentThread().getName()写入key);map.put(key,value);System.out.println(Thread.currentThread().getName()写入结束);} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.writeLock().unlock(); //解锁}}//取 读//读的时候所有人都可以读public void get(String key){readWriteLock.readLock().lock(); //加锁try {System.out.println(Thread.currentThread().getName()读取key);Object omap.get(key);System.out.println(Thread.currentThread().getName()读取结束);} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.readLock().unlock(); //解锁}}
} 这段代码中读操作和写操作的主要区别在于使用的锁不同读操作使用ReadWriteLock实例中的readLock()获取读锁而写操作使用writeLock()获取写锁。 读写锁允许多个线程同时读取共享资源但只允许一个线程写入共享资源。因此在读操作中多个线程可以同时获得读锁并读取共享资源而写操作需要获取排他的写锁以防止其他线程同时写入共享资源。 在MyCacheLock中put()方法使用writeLock()获取写锁以确保只有一个线程在写入数据时修改共享资源而get()方法使用readLock()获取读锁允许多个线程同时读取数据。 这种读写锁的机制可以提高并发性能因为允许多个线程同时读取共享资源而不会产生数据冲突同时通过只允许一个线程写入共享资源可以避免写操作的数据竞争和不一致性。 独占锁写锁一次只能被一个线程占有 共享锁读锁多个线程可以同时占有 在技术的道路上我们不断探索、不断前行不断面对挑战、不断突破自我。科技的发展改变着世界而我们作为技术人员也在这个过程中书写着自己的篇章。让我们携手并进共同努力开创美好的未来愿我们在科技的征途上不断奋进创造出更加美好、更加智能的明天