Как могут потоки чтения и записи, использующие ReentrantReadWriteLock, координировать, если они вызывают методы блокировки совершенно разных объектов? - PullRequest
0 голосов
/ 12 марта 2020

Пожалуйста, смотрите программу Java, написанную ниже. Здесь я хочу сделать потоки t0, t2 и t4 потоками читателя, а потоки t1 и t3 потоками писателя.

CreateThread. java

import java.util.concurrent.locks.*;
class CreateThread
{
    public static void main(String[] args)
    {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
        MyThread[] t = new MyThread[5];
        for(int i=0; i<5; i++)
        {
            if(i%2==0)
            {
                t[i] = new MyThread("t"+i, lock, "r");
            }
            else
            {
                t[i] = new MyThread("t"+i, lock, "w");
            }
        }
        for(int i=0; i<5; i++)
        {
            t[i].start();
        }
    }
}

MyThread. java

import java.util.concurrent.locks.*;
public class MyThread extends Thread
{
    ReentrantReadWriteLock lock = null;
    String rw=null;

    public MyThread(String name, ReentrantReadWriteLock lock, String rw)
    {
    super(name);
    this.lock=lock;
    this.rw=rw;
    }

    public void run()
    {
        if(rw=="w")
            lock.writeLock().lock();
        if(rw=="r")
            lock.readLock().lock();
        System.out.println(Thread.currentThread().getName()+" Got the Lock "+ rw);
        try
        {
            Thread.sleep(3000);
        }
        catch(InterruptedException e){}
        if(rw=="w")
            lock.writeLock().unlock();
        if(rw=="r")
            lock.readLock().unlock();
        System.out.println(Thread.currentThread().getName()+" Releases the Lock");
    }
}

Теперь посмотрим на эти два утверждения из этой программы:

lock.readLock().lock();
lock.writeLock().lock();

Согласно моему пониманию.

lock.readLock() создает объект типа ReentrantReadWriteLock$ReadLock, тогда как lock.writeLock() создает объект типа ReentrantReadWriteLock$WriteLock. Таким образом, оба оператора вызывают метод lock() для двух совершенно разных объектов. Количество потоков в объекте ReadLock не имеет значения, тогда как в WriteLock только один поток может получить блокировку одновременно.

Если мое понимание верно:

  1. Если потоки чтения и записи должны работать с различными объектами блокировки, то как они координируются?
  2. Согласно теории: «Если поток использует блокировку как чтение, тогда другие потоки чтения могут блокировать этот объект блокировки, но потоки писателя не могут ". Но здесь читатель и писатель работают над различными объектами блокировки.
  3. Если объект lock.writeLock() является свободным для писателя, почему бы писателю не go перейти в критическую секцию, несмотря на то, что многие читатели имеют блокировки на lock.readLock()?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...