ホームページ  >  記事  >  Java  >  読み取り/書き込みロックとは何ですか

読み取り/書き込みロックとは何ですか

王林
王林転載
2020-08-06 17:04:284294ブラウズ

読み取り/書き込みロックとは何ですか

複数のスレッドがリソース クラスを同時に読み取ることに問題がないことはわかっているため、同時実行の場合は、共有リソースを同時に読み取ることができるはずです。ただし、スレッドが共有リソースに書き込みたい場合、他のスレッドが同時に共有リソースに対して読み取りまたは書き込みを行ってはなりません。

(推奨チュートリアル: java 入門チュートリアル)

私たちが望んでいるのは、複数のスレッドが同時に読み取りできるようにすることですが、1 つのスレッドが書き込みを行っている限り、他のスレッドは待機する必要があります。

読み取り/書き込みロックとは何ですか

読み取り/書き込みロックはこの原則に基づいています。つまり、読み取り/書き込みロックでは複数のマルチスレッド アクセスを同時に許可できますが、書き込みスレッドがアクセスするときは、 、すべての読み取りスレッドとその他の書き込みスレッドがブロックされます。読み取り/書き込みロックは、実際には読み取りロックと書き込みロックの 2 つのロックを保持しており、読み取りロックと書き込みロックを分離することで、排他的ロック (排他ロック) に比べて同時実行性が大幅に向上します。

コード例:

public class ReadWriteLockDemo {
    public static void main(String[] args) {
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        Book book = new Book();//创建一本书,可读可写

        //两个写手
        for (int i = 0; i < 2; i++) {
            int num = i;
            new Thread(()->{
                try {
                    readWriteLock.writeLock().lock();
                    System.out.println("写手"+num+"在写文章");
                    book.write(String.valueOf(num),UUID.randomUUID().toString().substring(0,5));
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    readWriteLock.writeLock().unlock();
                }
            },String.valueOf(i)).start();
        }

        //6个读者
        for (int i = 0; i < 6; i++) {
            int num = i;
            new Thread(()->{
                try {
                    readWriteLock.readLock().lock();
                    String word = book.read(String.valueOf(num % 2));
                    System.out.println("读者"+num+"在阅读文章..."+word);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    readWriteLock.readLock().unlock();
                }
            },String.valueOf(i)).start();
        }
    }
}
class Book{
    HashMap<String, String> map = new HashMap<>();
    public void write(String key,String val){
        map.put(key, val);
    }
    public String read(String key){
        String word = map.get(key);
        return word;
    }
}

出力結果:

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:F:\MyDir\IDEA\IDEA2018\IntelliJ IDEA 2018.2.4\lib\idea_rt.jar=54141:F:\MyDir\IDEA\IDEA2018\IntelliJ IDEA 2018.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;E:\idea_workplace\javaBase\target\classes"
写手0在写文章
写手1在写文章
读者0在阅读文章...6b021
读者1在阅读文章...220e4
读者2在阅读文章...6b021
读者4在阅读文章...6b021
读者3在阅读文章...220e4
读者5在阅读文章...220e4

Process finished with exit code 0

読み取り/書き込みロックの効率

(ビデオ チュートリアルの推奨: java ビデオ チュートリアル)

読み取り/書き込みロックがミューテックス ロックを使用してパフォーマンスを向上させるかどうかは、データの読み取りおよび変更の頻度、読み取りおよび書き込み操作の継続時間、およびデータの競合によって決まります。または同時にデータを書き込みます。

たとえば、最初にデータが設定され、その後頻繁に検索され、頻繁に変更されるコレクション (ある種のディレクトリなど) は、読み取り/書き込みロックを使用するのに最適な候補です。ただし、更新が頻繁になると、データはほとんどの場合排他的にロックされ、同時実行性はほとんど増加しません。

さらに、読み取り操作が短すぎる場合、読み取り/書き込みロック実装 (ミューテックスよりも複雑です) のオーバーヘッドが実行コストの大半を占める可能性があります。コードの小さな部分を通過するすべてのスレッドをシリアル化します。最終的には、プロファイリングと測定のみが、読み取り/書き込みロックの使用がアプリケーションに適切であるかどうかを判断します。

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

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。