Метод getCount / setCount, который вызывается в двух потоках t1, t2, является поточно-ориентированным, не так ли?
Если вы намереваетесь внести изменения, сделанные t2 visible до t1 - да, счет, установленный потоком 2, будет виден потоку t1.
Это потому, что поток 1 каждый раз получает экземпляр singleton, вызывая getInstance
, который является synchronized
методом. Это устанавливает отношение случай-до , и изменения, сделанные потоком 2, будут видны потоку 1.
Однако, если вы измените свой код на вызов getInstance
только один раз и используйте эту ссылку для вызова getCount
, тогда изменения, сделанные другим потоком (t2), могут не стать видимыми для потока t1, и он может продолжать цикл.
Singleton s = Singleton.getInstance();
while(s.getCount()==0){
//loop
}
Чтобы эти изменения были отражены, вы должны сделать count
a volatile
private volatile int count;