2017-01-28 12 views
0

ReentrantLock обеспечивает флаг boolean fair при создании объекта блокировки.Синхронизация в java - новом ReentrantLock (true) и новом ReentrantLock (false), производящем тот же результат?

  1. fair: true

    Нити получают доступ к критической секции на основе времени, они ждут.

  2. 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 

ответ

2

Все fair false означает, что блокировка позволит потокам, хотя и хочет. С небольшим количеством потоков это может случиться так, что они ждут, но это не гарантирует никаких гарантий.

+1

Сначала я попытался с 10-20 потоками и попробовал несколько раз, даже я думал, что он назначит блокировку на основе порядка запроса для критического раздела. –

+2

@DharmvirTiwari. Javadoc говорит, что 'ReentrantLock (true) 'должен создать справедливый замок, но он не говорит, что' ReentrantLock (false) 'должен создать блокировку _unfair_. Если ваша JRE, похоже, создает справедливую блокировку, даже когда 'fair == false', то это не доказывает, что с ней что-то не так. –

 Смежные вопросы

  • Нет связанных вопросов^_^