public class Main{
public static void main(String[] args) throws Exception {
// Creating objects for class Check(2 different objects)
Check c = new Check("s1");
Check c1 = new Check("s2");
c.start();c1.start();
}
}
class Check extends Thread{
Check(String name){super(name);}
private Integer ab = 2;
public void run(){
synchronized (ab) {
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++)System.out.print(i+" ");
}
}
}
Здесь я синхронизирован по переменной ab. И я создал два разных экземпляра класса Check также, но я всегда получаю вывод для s1, за которым следует s2 или наоборот, но не смешанный, почему это так? когда я уже создал два отдельных объекта (в основном), поэтому два разных потока, две разные переменные ab, и как он становится общим ресурсом для двух разных объектов?Синхронизация потоков по переменной экземпляра Integer
B.T.W., вы не синхронизируете на _variable_, вы синхронизируете объект, к которому относится переменная. Это важное различие, потому что некоторые люди допустили ошибку, не осознавая, что переменная может ссылаться на разные объекты в разное время, а некоторые ошибались, не понимая, что на один и тот же объект могут ссылаться более чем одна переменная. –
Этот код больше похож на тестовый код, чем на реальный случай, но если вы хотите синхронизировать без блокировки, но потокобезопасно, [Number] (https://docs.oracle.com/javase/8/ docs/api/java/lang/Number.html), вы можете использовать [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html). –
@jameslarge: Я понимаю, что вы говорите. Я не был точен, потому что моя проблема была сосредоточена на каком-то другом вопросе. В любом случае, спасибо. :) – Santanu