import java.util.concurrent.locks.*;
class CalendarUser extends Thread {
public static final String[] WEEKDAYS = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
private static volatile int today = 0;
private static ReentrantReadWriteLock marker = new ReentrantReadWriteLock();
private static Lock readMarker = marker.readLock();
private static Lock writeMarker = marker.writeLock();
public CalendarUser(String name) {
this.setName(name);
}
public void run() {
while ( today < WEEKDAYS.length-1) {
if (this.getName().contains("Writer")) { // update the shared calendar
writeMarker.lock();
System.out.println(this.getName()+" "+today);
try {
today++;
} catch (Exception e)
{e.printStackTrace(); }
{
writeMarker.unlock();
}
} else {
readMarker.lock();
try {
} catch (Exception e) {
e.printStackTrace();
} finally {
readMarker.unlock();
}
}
}
}
}
public class ReadWriteLockDemo {
public static void main(String[] args) {
// create ten reader threads
for (int i=0; i<10; i++)
new CalendarUser("Reader-"+i).start();
// ...but only two writer threads
for (int i=0; i<2; i++)
new CalendarUser("Writer-"+i).start();
}
}
输出:
作家-0 0
作家-0 1
作家-0 2
作家-0 3
作家-0 4
作家-0 5
作家1 6
写者0在today = 6
时退出循环。我不了解的是Writer-1在today = 6
时执行一次。那怎么可能?如果不满足循环条件,它将如何进入循环?我的直觉告诉我,它与JIT编译器有关。