RWLock, ReentrantReadWriteLock讀寫鎖的使用

讀寫鎖
舉例:紅蜘蛛,多個人聽(讀),一個人講(寫)
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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章