网站建设又叫什么,网站的后台一般用什么做的,wordpress更新以后进不去,贵州华瑞网站建设有限公司ReadWriteLock 读写锁 又叫排他锁
如果使用互斥锁#xff0c;一个线程在读#xff0c;其他线程也不能读也不能写
换成读写锁的时候#xff0c;读线程是读锁#xff0c;写线程是写锁#xff0c;写锁是排他的
在多线程大大提高效率#xff0c;当一个线程在读的时候…ReadWriteLock 读写锁 又叫排他锁
如果使用互斥锁一个线程在读其他线程也不能读也不能写
换成读写锁的时候读线程是读锁写线程是写锁写锁是排他的
在多线程大大提高效率当一个线程在读的时候其他线程也可以进来继续读
import java.util.Random;
import java.util.concurrent.atomic.LongAdder;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class T10_TestReadWriteLock {static Lock lock new ReentrantLock();private static int value;static ReadWriteLock readWriteLock new ReentrantReadWriteLock();static Lock readLock readWriteLock.readLock();static Lock writeLock readWriteLock.writeLock();public static void read(Lock lock) {try {lock.lock();Thread.sleep(1000);System.out.println(read over!);//模拟读取操作} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public static void write(Lock lock, int v) {try {lock.lock();Thread.sleep(1000);value v;System.out.println(write over!);//模拟写操作} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public static void main(String[] args) {//Runnable readR ()- read(lock);Runnable readR ()- read(readLock);//Runnable writeR ()-write(lock, new Random().nextInt());Runnable writeR ()-write(writeLock, new Random().nextInt());for(int i0; i18; i) new Thread(readR).start();for(int i0; i2; i) new Thread(writeR).start();}
}使用ReentrantLock 20s 使用ReentrantReadWriteLock 2s 目前有 18 个线程执行读操作每个读操作需要 1 秒钟执行同时有 2 个线程执行写操作每个写操作也需要 1 秒钟执行。
因为读操作是共享锁读锁多个线程可以同时获得读锁但写操作是独占锁写锁只有一个线程能获得写锁其他线程需要等待。
根据代码逻辑18 个读线程并发执行每个读线程需要 1 秒执行完毕因为读操作是并发执行的所以整体读操作的时间是 1 秒。
同时2 个写线程需要依次获取写锁执行写操作每个写线程也需要 1 秒执行完毕。由于写操作是独占锁所以第一个写线程执行完毕后第二个写线程才能获取到写锁执行写操作。
因此整体来看读线程总共需要 1 秒写线程总共需要 2 秒1 秒执行写操作1 秒等待另一个写线程执行完毕所以整个程序执行的时间大约是 2 秒左右。