#java #multithreading #synchronization
#java #многопоточность #синхронизация
Вопрос:
JAVA — синхронизация потоков из разных объектов. Обратитесь к приведенному ниже примеру; если это один объект, он работает нормально; но если я использую 2, он работает не так, как ожидалось; В моем случае использования у меня есть, скажем, 20 объектов, у которых другое строковое значение, и все они выполняются одновременно; блок синхронизации не соблюдается
public class temp {
synchronized void printTable(int n){//method not synchronized
for(int i=1;i<=5;i ){
System.out.println(n*i);
try{
Thread.sleep(400);
}catch(Exception e){System.out.println(e);}
}
}
}
class MyThread1 extends Thread{
temp t;
MyThread1(temp t){
this.t=t;
}
public void run(){
t.printTable(5);
}
}
class MyThread2 extends Thread{
temp t;
MyThread2(temp t){
this.t=t;
}
public void run(){
t.printTable(100);
}
}
class TestSynchronization1{
public static void main(String args[]){
temp obj = new temp();//only one object
temp obj2 = new temp();
MyThread1 t1=new MyThread1(obj);
MyThread2 t2=new MyThread2(obj2);
t1.start();
t2.start();
}
}
Вывод:
5
100
200
10
15
300
400
20
25
500
Но если я использую один экземпляр temp
class TestSynchronization1{
public static void main(String args[]){
temp obj = new temp();//only one object
//temp obj2 = new temp();
MyThread1 t1=new MyThread1(obj);
MyThread2 t2=new MyThread2(obj);
t1.start();
t2.start();
}
}
Вывод:
5
10
15
20
25
100
200
300
400
500
Комментарии:
1. Пожалуйста, объясните, какое поведение вы видите и какое поведение вы ожидаете. Какие синхронизированные блоки вы имеете в виду, в вашем коде их нет.
2. @tgdavies — У меня есть куча объектов, которые нужно запускать одновременно; но когда я делаю это в некоторых важных областях (общие методы), я вижу, что возникают некоторые условия гонки; на данный момент я добавил задержку в 700 мс между запуском каждого объекта, чтобы смягчить проблему
3. Без описания проблемы и без кода, в котором возникает проблема, мы не можем дать никаких советов.
4. Ваш пример не разделяет какое-либо состояние между потоками, поскольку каждый поток имеет свой собственный экземпляр temp .
5. Теперь я добавил код в описание