2016-05-16 1 views
0

Проблема в том, что я не вижу эффекта синхронизации блока. В Теории я знаю, что это должно блокировать блок, пока это не будет сделано с потоком, который будет обрабатываться в то время. Когда я запускаю следующий код с синхронизированным блоком или без него, ничего не меняется, ну, по крайней мере, это то, что я думаю. В принципе, как сделать эти потоки упорядоченными? Пожалуйста, очистите меня, спасибо.Разница между несинхронизированными потоками и синхронизированными потоками

public class Threads9 extends Thread{ 
    private String name; 

    public Threads9(String paramName){ 
     name = paramName; 
    } 

    public void run() { 
     print(); 
    } 
    private void print() { 
     synchronized(this){ 
     for(int i = 0;i<10;i++){ 
      System.out.println(name+ " looping"); 
     } 
     } 
    } 
} 

public class Threads9Main{ 
    public static void main(String[] args) { 

     Threads9 thread1 = new Threads9("Thread1"); 
     Threads9 thread2 = new Threads9("Thread2"); 

     thread1.start(); 
     thread2.start(); 
    } 
} 
+1

Использование 'System.out.println (...)' не является хорошей идеей, так как этот метод не поточно- (например, это не гарантирует, что вывод записывается в том же порядке, как 'System. out.println (...) '). Возможно, вы хотите взглянуть на [этот учебник] (https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html). – Turing85

+1

Два потока синхронизируются на разных объектах. –

+0

Re: «... ничего не меняется». Это очень слабый способ описать проблему, которую вы видите. На этот раз вам повезло, но лучший способ получить помощь на этом сайте (т. Е. Способ получить наилучшую помощь) - показать нам ваш код, рассказать нам подробно, что вы думаете, что это будет делать, рассказать нам, как это произошло для удовлетворения ваших ожиданий (включая полный текст любых непредвиденных сообщений об ошибках), а затем спросите нас, что пошло не так. –

ответ

1

Вы синхронизируете «это», и оно отличается от потоков. Попробуйте синхронизировать: Threads9.class, и это сработает. Кроме того, увеличьте размер петли резко или сначала закончите до начала второго запуска.

+1

Как я недавно был проинформирован, когда вы правы, что блокировка на «Thread9.class» будет работать, лучше использовать блокировку на явном мониторе, поскольку другие объекты, не связанные друг с другом, могут блокироваться для объекта класса. – Lee

+0

Может быть. Однако, позволяя другим также блокировать объект (класс), вы можете уменьшить вероятность взаимоблокировки (все зависит, как обычно, от прецедента). –

0

Ваши объекты не имеют доступ к монитору, поэтому у вас не будет связи между потоками.

Try:

public class Threads9 extends Thread{ private String name; 

    private static Object lock = new Object(); 

    public Threads9(String paramName){ 
     name = paramName; 
    } 

    public void run() { 
     print(); 
    } 

    private void print() { 
     synchronized(lock){ 
      for(int i = 0;i<10;i++){ 
       System.out.println(name+ " looping"); 
      } 
     } 
    } 
} 
+0

Но проблема в том, что она только показывает мне последнюю цепочку много раз. Как я могу заставить его показывать соответствующие потоки и один за другим? –

0

Измените код, как это и положить синхронизируются блок внутри перспективе.

public Threads9(String paramName){ 
    name = paramName; 
} 

public void run() { 
    synchronized(this){ 
    print(); 
    } 
} 

private void print() { 

    for(int i = 0;i<10;i++){ 
     System.out.println(name+ " looping"); 
    } 

} 
+0

Как это поможет? Это не так. – bowmore