синхронизировать на разных объектах видимости - PullRequest
0 голосов
/ 13 октября 2018

следующий код показывает синхронизацию на объекте, отличном от этого:

public class A {

int a,b,c,d;

public void method1(Object x){
   synchronized(x){
     // is a ,b ,c ,d guarantee visibility ? 
   }
}

   public synchronized void method2() {
        a++;
    }
}

Я знаю, что будет проблема при редактировании a, b, c, d с разными блокировками в method1 и method2, ноВопрос: изменения, сброшенные методом method2, будут видны для method1?потому что они не используют один и тот же замок.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Я знаю, что будет проблема с редактированием a, b, c, d с использованием разных блокировок в method1 и method2, но вопрос в том, видны ли изменения, сброшенные method2, видимыми для method1?потому что они не используют одну и ту же блокировку.

Без какой-либо другой синхронизации Java не дает никаких гарантий относительно того, будет ли видимым изменение для A.a, выполненное через A.method2() в одном потоке.A.method1() внутри или снаружи блока synchronized в другом потоке.Программа, в которой возникает этот вопрос, не синхронизирована должным образом, поэтому ее поведение не определено.

0 голосов
/ 13 октября 2018

Если вы только читаете a, на x64 это будет работать, поскольку барьеры памяти не ограничены определенными областями памяти.Тем не менее, я понимаю, что Java не гарантирует, что это будет потокобезопасным, поскольку блокировки применяются к различным объектам.Конечно, если вы увеличите a в первом методе, это не будет потокобезопасным.

...