Maison > Java > javaDidacticiel > Comment utiliser le verrou Java en lecture-écriture

Comment utiliser le verrou Java en lecture-écriture

王林
Libérer: 2023-04-23 22:46:23
avant
1512 Les gens l'ont consulté

1. Sélectivité équitable, prend en charge l'acquisition de verrous injustes et équitables, un débit injuste vaut mieux qu'équitable.

2. Réentrée, le verrouillage en lecture et le verrouillage en écriture prennent en charge la réentrée du fil.

3. La rétrogradation du verrouillage suit l'ordre d'acquisition du verrouillage en écriture, d'acquisition du verrouillage en lecture et de libération du verrouillage en écriture.

Instances

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();
        }
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal