2013-09-22 5 views
1

Я написал код, который создал несколько потоков и начал его. Я заблокировал монитор на объекте с использованием синхронизированного блока. Ожидается, что первый созданный поток должен заблокировать объект и завершить его работу. то любой другой объект может ввести его.java-why синхронизированный блок не дает правильный результат с циклом

но его не происходит, программа ниже.

class ThreadCreationDemo implements Runnable 
{ 
    public void run() 
    { 
     synchronized(this) 
     { 
      for(int i=0;i<10;i++) 
      { 
       System.out.println("i: "+i+" thread: "+Thread.currentThread().getName()+" threadgroup: "+Thread.currentThread().getThreadGroup()+" "+Thread.holdsLock(this)); 
       try { 
        Thread.sleep(1000); 
       } 
       catch(Exception e) 
       { 
        System.out.println(e.toString()); 
       }   
      } 
     } 
    } 

    public static void main(String args[]) 
    { 
     Thread t[]=new Thread[5]; 

     for(int i=0;i<5;i++) 
     { 
      t[i]=new Thread(new ThreadCreationDemo()); 
      t[i].start(); 
     } 
    } 
} 

Я ожидаю, что результат должен быть таким.

первые на все значения I = 0 до 9 печатается под названием нити говорят нить 0 затем нить 1 и т.д.

но вывод таков:

i: 0 thread: Thread-1 
i: 0 thread: Thread-3 
i: 0 thread: Thread-2 
i: 0 thread: Thread-0 
i: 0 thread: Thread-4 
i: 1 thread: Thread-1 
i: 1 thread: Thread-4 
i: 1 thread: Thread-3 
i: 1 thread: Thread-0 
i: 1 thread: Thread-2 
i: 2 thread: Thread-1 
i: 2 thread: Thread-3 
i: 2 thread: Thread-2 
i: 2 thread: Thread-0 
i: 2 thread: Thread-4 
i: 3 thread: Thread-1 
i: 3 thread: Thread-3 
i: 3 thread: Thread-0 
i: 3 thread: Thread-4 
i: 3 thread: Thread-2 
i: 4 thread: Thread-1 
i: 4 thread: Thread-3 
i: 4 thread: Thread-2 
i: 4 thread: Thread-4 
i: 4 thread: Thread-0 
i: 5 thread: Thread-1 
i: 5 thread: Thread-4 
i: 5 thread: Thread-3 

ответ

6

Проблема вас каждый раз создают новый объект: new ThreadCreationDemo()

Так что все потоки получают блокировку на разных объектах, поэтому блокировка не удастся.

3

Вы синхронизируете на

synchronized(this) 

Другими словами, каждый экземпляр блокировки на себя. Вы не блокируете общий объект.

Решение состоит в том, чтобы заблокировать статический объект, общий для всех экземпляров класса. Например

synchronized (ThreadCreationDemo.class) {...} 

Или при создании Thread, передать в общей ссылке на объект, который каждый Thread может синхронизироваться на.

new ThreadCreationDemo(new Object()); 
... 
public ThreadCreationDemo(Object o) { 
    this.lock = o 
} 

public void run() { 
    synchronized (lock) { 
     ... 
    } 
} 
Смежные вопросы