Javaの読み取り/書き込みロックの使用方法

王林
リリース: 2023-04-23 22:46:23
転載
1485 人が閲覧しました

1. 公平な選択性、不公平かつ公平なロック取得をサポートし、不公平なスループットは公平よりも優れています。

2. 再エントリ: 読み取りロックと書き込みロックの両方がスレッドの再エントリをサポートします。

3. ロックのダウングレードは、書き込みロックの取得、読み取りロックの取得、書き込みロックの解放の順で行い、書き込みロックを読み取りロックにダウングレードできます。

public class ReadWriteLockTest {
    public static void main(String[] args) {
 
        final Queue q = new Queue();
 
        for (int i = 0; i < 3; i++) {
 
            new Thread() {
                @Override
                public void run() {
 
                    while (true) {
                        q.get();
                    }
                }
            }.start();
 
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        q.put(new Random().nextInt(10000));
                    }
                }
            }.start();
        }
    }
}
 
class Queue {
 
    //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
    ReadWriteLock rwl = new ReentrantReadWriteLock();
    private Object data = null;//共享数据,只能有一个线程能写数据,但可以有多个线程读该数据
 
    public void get() {
        //上读锁,其他线程只能读不能写
        rwl.readLock().lock();
        try {
 
            System.out.println(Thread.currentThread().getName() + " be ready to read data!");
            Thread.sleep((long) (Math.random() * 1000));
            System.out.println(Thread.currentThread().getName() + " have read data :" + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            rwl.readLock().unlock();
        }
    }
 
    public void put(Object data) {
        //上写锁,不允许其他线程读也不允许写
        rwl.writeLock().lock();
 
        try {
            System.out.println(Thread.currentThread().getName() + " be ready to write data!");
 
            Thread.sleep((long) (Math.random() * 1000));
 
            this.data = data;
            System.out.println(Thread.currentThread().getName() + " have write data: " + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            rwl.writeLock().unlock();
        }
    }
}
ログイン後にコピー

以上がJavaの読み取り/書き込みロックの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート