1

Я новичок в Java, пытаясь выучить Java-концепции с реализацией. Причина для класса ReentrantLock заключается в понимании Locks.Второй поток выполнен, хотя первый поток заблокирован с использованием ReentrantLock

Я создаю 3 темы, и в них я просто увеличиваю Глобальный счетчик. Я защищаю счетчик, который перезаписывает другой поток, используя Locks.

import java.util.concurrent.locks.ReentrantLock; 

class ReentryHandledSingleThread extends Thread 
{ 
    static long counter = 0; 

    private int myId; 

    private final ReentrantLock myLock = new ReentrantLock(); 

    public ReentryHandledSingleThread(int id) 
    { 
     this.myId = id; 
    } 

    public void incrementTheCounter() 
    { 

     long stackvariable; 
     int i; 

     for (i = 0; i < 10000; i++) 
     { 
      stackvariable = ReentryHandledSingleThread.counter; 
      stackvariable = stackvariable + 1; 
      ReentryHandledSingleThread.counter = stackvariable; 
     } 
     System.out.println("The value from counter is " + ReentryHandledSingleThread.counter); 
     return; 

    } 

    public void run() 
    { 
     System.out.println("Started Thread No. " + this.myId); 
     this.myLock.lock(); 
     { 
      System.out.println("LOCKED Thread No. " + this.myId); 
      this.incrementTheCounter(); 
     } 
     System.out.println("UNLOCKED Thread No." + this.myId); 
     this.myLock.unlock(); 

    } 
} 

public class RentryHandle 
{ 

    public static void main(String[] args) 
    { 
     System.out.println("Started Executing Main Thread"); 
     int noOfThreads = 3; 
     ReentryHandledSingleThread threads[] = new ReentryHandledSingleThread[noOfThreads]; 
     for (int j = 0; j < noOfThreads; j++) 
     { 
      threads[j] = new ReentryHandledSingleThread(j); 
     } 

     for (int j = 0; j < noOfThreads; j++) 
     { 
      threads[j].start(); 
     } 

     for (int j = 0; j < noOfThreads; j++) 
     { 
      try 

      { 
       threads[j].join(); 
      } 
      catch (InterruptedException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
     System.out.println("Finished Executing Main thrread"); 

    } 
} 

Наблюдаемые Выход из выше кода

Started Executing Main Thread 
    Started Thread No. 0 
    LOCKED Thread No. 0 
    Started Thread No. 2 
    LOCKED Thread No. 2 
    The value from counter is 10226 
    UNLOCKED Thread No.0 
    The value from counter is 16165 
    UNLOCKED Thread No.2 
    Started Thread No. 1 
    LOCKED Thread No. 1 
    The value from counter is 26165 
    UNLOCKED Thread No.1 
    Finished Executing Main thrread 

Мой Ожидаемым результатом

Started Executing Main Thread 
    Started Thread No. 0 
    LOCKED Thread No. 0 
    The value from counter is 10000 
    UNLOCKED Thread No.0 
    Started Thread No. 1 
    LOCKED Thread No. 1 
    The value from counter is 20000 
    UNLOCKED Thread No.1 
    Started Thread No. 2 
    LOCKED Thread No. 2 
    The value from counter is 30000 
    UNLOCKED Thread No.2 
    Finished Executing Main thrread 

Я прошел через reentrantlock-lock-doesnt-block-other-threads Тем не менее, я NOTusing здесь

Condition.await()

Таким образом, я не был в состоянии сотрудничать связаны с моей реализации. Пожалуйста, помогите мне понять ошибку или понять приложение ReentrantLock в моей реализации, которое вызывает различия в Exepected Output и наблюдаемом выходе.

ответ

1

Вопрос заключается в том, что каждый объекте нити имеет свой собственный замок (и способно блокировать его независимо от то, что всех других нитей делают):

private final ReentrantLock myLock = new ReentrantLock(); 

Если вы хотите, чтобы замок общего для всех нитей, сделать вышеуказанный объект static.

+0

Благодарю вас, сэр ... После того, как вы сделали частным финалом ReentrantLock myLock = new ReentrantLock(); как закрытый статический окончательный ReentrantLock myLock = new ReentrantLock(); Мне удалось получить ожидаемый результат. –