ReentrantLock обеспечивает флаг boolean fair
при создании объекта блокировки.Синхронизация в java - новом ReentrantLock (true) и новом ReentrantLock (false), производящем тот же результат?
fair
:true
Нити получают доступ к критической секции на основе времени, они ждут.
fair
:false
Там нет никакой конкретной политики для придания критической секции к резьбе.
Ниже мой код для того же:
public class ThreadDemo {
private Lock lock = new ReentrantLock(false);
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
Thread[] tArr = new Thread[5];
// Creates 5 thread and stores them in a array
for (int i = 0; i < 5; i++) {
tArr[i] = new Thread(() -> {
td.enterCriticalSection(new Date().getTime());
}, "Thread " + i);
}
// Iterate through the array and start it.
for (int i = 0; i < 5; i++) {
tArr[i].start();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void enterCriticalSection(long waitTime) {
System.out.println(Thread.currentThread().getName() + " requesting critical section at:"
+ new SimpleDateFormat("HH:mm:ss:SSS").format(new Date().getTime()));
// Gets Lock
lock.lock();
try {
/*
* Logs the entry time in critical section and waiting period for
* the thread
*/
System.out.println(Thread.currentThread().getName() + " in critical section at "
+ new SimpleDateFormat("HH:mm:ss:SSS").format(new Date().getTime()));
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// Releases lock
lock.unlock();
}
}
}
Но как ярмарка как истинный и справедливо как ложные я получаю тот же результат, то есть нить, которая ждет самый длинный период, получает критический участок
Thread 0 requesting critical section at:01:57:48:562
Thread 0 in critical section at 01:57:48:563
Thread 1 requesting critical section at:01:57:49:520
Thread 2 requesting critical section at:01:57:50:520
Thread 3 requesting critical section at:01:57:51:520
Thread 4 requesting critical section at:01:57:52:520
Thread 1 in critical section at 01:57:53:564
Thread 2 in critical section at 01:57:58:564
Thread 3 in critical section at 01:58:03:565
Thread 4 in critical section at 01:58:08:566
Сначала я попытался с 10-20 потоками и попробовал несколько раз, даже я думал, что он назначит блокировку на основе порядка запроса для критического раздела. –
@DharmvirTiwari. Javadoc говорит, что 'ReentrantLock (true) 'должен создать справедливый замок, но он не говорит, что' ReentrantLock (false) 'должен создать блокировку _unfair_. Если ваша JRE, похоже, создает справедливую блокировку, даже когда 'fair == false', то это не доказывает, что с ней что-то не так. –