Пожалуйста, смотрите программу 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
только один поток может получить блокировку одновременно.
Если мое понимание верно:
- Если потоки чтения и записи должны работать с различными объектами блокировки, то как они координируются?
- Согласно теории: «Если поток использует блокировку как чтение, тогда другие потоки чтения могут блокировать этот объект блокировки, но потоки писателя не могут ". Но здесь читатель и писатель работают над различными объектами блокировки.
- Если объект
lock.writeLock()
является свободным для писателя, почему бы писателю не go перейти в критическую секцию, несмотря на то, что многие читатели имеют блокировки на lock.readLock()
?