Java 演示ReadWriteLock使用的示例
我试图理解Java 演示ReadWriteLock使用的示例,java,multithreading,locking,reentrantlock,Java,Multithreading,Locking,Reentrantlock,我试图理解ReadWriteLock的概念,并实现了下面的简单示例。据我所知,每当一个线程具有readlock,另一个线程就可以获得readlock。但是对于具有writelock的线程,只有在另一个线程释放锁之前,其他线程才能获取写/读锁。然而,从下面程序的输出中,我注意到在WriterOdd释放锁(打印释放锁的输出)之前,Reader线程进入并读取number字符串。是因为刚刚释放写锁之后,读卡器线程进来,然后打印了释放写锁的打印语句吗 public static void main(Str
ReadWriteLock
的概念,并实现了下面的简单示例。据我所知,每当一个线程具有readlock
,另一个线程就可以获得readlock
。但是对于具有writelock
的线程,只有在另一个线程释放锁之前,其他线程才能获取写/读锁。然而,从下面程序的输出中,我注意到在WriterOdd
释放锁(打印释放锁的输出)之前,Reader
线程进入并读取number
字符串。是因为刚刚释放写锁
之后,读卡器
线程进来,然后打印了释放写锁
的打印语句吗
public static void main(String[] args) {
new Thread(new Reader(), "Reader 1").start();
new Thread(new Reader(), "Reader 2").start();
new Thread(new WriterEven(), "Writer Even").start();
new Thread(new WriterOdd(), "Writer Odd").start();
}
public static class Reader implements Runnable {
public void run() {
for (int i = 1; i <= 6; i++) {
rwl.readLock().lock();
// rl.lock();
System.out.println(Thread.currentThread().getName() + " is reading" + number);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
rwl.readLock().unlock();
}
}
}
}
public static class WriterEven implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName() + " is trying writing");
rwl.writeLock().lock();
System.out.println(Thread.currentThread().getName() + " got the lock");
for (int i = 2; i <= 6; i += 2) {
System.out.println(Thread.currentThread().getName() + " is writing");
number = number.concat(" " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
}
rwl.writeLock().unlock();
System.out.println(Thread.currentThread().getName() + " left the lock");
}
}
public static class WriterOdd implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName() + " is trying writing");
rwl.writeLock().lock();
System.out.println(Thread.currentThread().getName() + " got the lock");
for (int i = 1; i <= 5; i += 2) {
System.out.println(Thread.currentThread().getName() + " is writing");
number = number.concat(" " + i);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
}
rwl.writeLock().unlock();
System.out.println(Thread.currentThread().getName() + " left the lock");
}
}
在释放锁之后,写入有关释放写锁的控制台消息的代码行
rwl.writeLock().unlock();
// here readers can read already
// because they are free to aquire lock
System.out.println(Thread.currentThread().getName() + " left the lock");
旁白:在最后一个街区解锁。
rwl.writeLock().unlock();
// here readers can read already
// because they are free to aquire lock
System.out.println(Thread.currentThread().getName() + " left the lock");