2016-06-10 3 views
0

согласно моему пониманию, если я использовал синхронизированный ключевое слово, то только один поток может войти и как только он выходит затем только другой thread.But, почему мой код ниже печатает иногда первые 2 Второй 2Невозможно понять выход

package com.vikash.GeeksForGeeks; 

public class Test implements Runnable{ 

    private static int count; 

    public synchronized void incrementCount() 
    { 
     count++; 
     System.out.println(Thread.currentThread().getName()+" "+count); 
    } 
    public static void main(String[] args) throws InterruptedException { 

     Thread t1=new Thread(new Test()); 
     Thread t2=new Thread(new Test()); 
     t1.start();t1.setName("First"); 
     t2.start();t2.setName("Second"); 
     t1.join(); 
     t2.join(); 
     System.out.println("Count Value="+count); 

    } 
    @Override 
    public void run() { 
     incrementCount(); 
    } 
} 

ответ

2

Вы создаете две отдельные экземпляры Test, и ваш метод incrementCount является экземпляр метод, несмотря на это инкрементируя статический переменной.

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

Если вы сделаете incrementCount статическим методом, то оба потока будут пытаться получить монитор для Test.class, и он должен работать в этих условиях. (Несмотря на то, что нет никакой гарантии, что main нити прочитает наиболее недавно составленное значение count ...)

В качестве альтернативы, создать один экземпляра Test, и передать оба Thread конструкторов, в какой момент они оба попытаются получить монитор для одного и того же экземпляра Test. Решающим моментом является то, что, если два потока приобретают разные мониторы, они оба смогут это сделать, не дожидаясь другого ...