Синхронизация потоков из разных объектов -{ОТРЕДАКТИРОВАНО}

#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. Теперь я добавил код в описание