讀寫鎖
舉例:紅蜘蛛,多個人聽(讀),一個人講(寫)
synchronized重量太大不適合
i+會生成新的對象
string a =new String(“abc”)
string a= “abc”
可以讓讀睡一秒(Thread.sleep(10);//這句一加可能爲null因爲寫延遲了,有些讀已經開始讀對象了,導致讀到空值)
package juc;
import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
//題目要求 一百個線程讀 一個線程寫
class RwLock{
private Object obj;
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
public void writeLock(Object obj){
try {
//寫
rwLock.writeLock().lock();
this.obj=obj;
System.out.println("寫的線程:"+Thread.currentThread().getName()+"寫的對象:"+obj);
} catch (Exception e) {
e.printStackTrace();
} finally {
rwLock.writeLock().unlock();
}
}
public void readLock(){
try {
//讀
rwLock.readLock().lock();
System.out.println("讀的線程:"+Thread.currentThread().getName()+"讀寫的obj:"+obj);//這個是寫完之後,線程再去讀的寫對象
} catch (Exception e) {
e.printStackTrace();
} finally {
rwLock.readLock().unlock();
}
}
}
public class RwLockDemo {
public static void main(String[] args){
RwLock rwLock = new RwLock();
new Thread(()->{
try {
Thread.sleep(10);//這句一加可能爲null因爲寫延遲了,有些讀已經開始讀對象了,導致讀到空值
} catch (InterruptedException e) {
e.printStackTrace();
}
rwLock.writeLock("內容對象");
},"writeThread").start();
for(int i = 1; i <= 100 ; i++){
new Thread(()->{
rwLock.readLock();
},String.valueOf(i)).start();
}
}
}