Я написал программу по синхронизированному блоку, заблокировав на .class, и моя программа выполняет поток по потоку. Но когда я пишу один и тот же код с использованием синхронизированного метода, вывод полностью отличается.Результаты программы с синхронизированной программой отличаются от синхронизированного метода
Синхронного блок программа приведена ниже:
public class SyncBlock {
public static void main(String[] args) {
final Thread t1 = new SimpleThread("First Thread");
final Thread t2 = new SimpleThread("Second Thread");
t1.start();
t2.start();
}
}
class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
public void run() {
synchronized (SyncBlock.class) {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " says " + i);
try {
sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
}
}
System.out.println(getName() + " is done.");
}
}
}
Выездные путы:
First Thread says 0
First Thread says 1
First Thread says 2
First Thread says 3
First Thread says 4
First Thread is done.
Second Thread says 0
Second Thread says 1
Second Thread says 2
Second Thread says 3
Second Thread says 4
Second Thread is done.
Теперь я использую ту же самую программу, используя синхронизированный метод. Но он ведет себя по-другому. Не могли бы вы объяснить, будут ли они вести себя по-другому или есть любое решение для получения того же результата с использованием как синхронизированного блока, так и метода.
Использование синхронизированного метода:
теперь синхронизируются метод запуска и заменить этот код:
public synchronized void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + " says " + i);
try {
sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
}
}
System.out.println(getName() + " is done.");
}
Здесь выход отличается:
First Thread says 0
Second Thread says 0
Second Thread says 1
First Thread says 1
First Thread says 2
Second Thread says 2
First Thread says 3
Second Thread says 3
First Thread says 4
First Thread is done.
Second Thread says 4
Second Thread is done.
Есть ли какое-либо решение для выполнения по одному потоку с использованием метода синхронизации. – Murali
@Murali - В вашем * конкретном случае, нет. Поскольку ваш код * независим *, вам понадобится блокировка, и вам придется подавать в суд на эту блокировку в обоих местах. Таким образом, для этого потребуется синхронизированный блок, синхронизированный метод не будет работать. Любой метод, который вы синхронизируете, повлияет только на класс (статический метод) или экземпляр (нестатический метод) только класса SimpleThread. – TheLostMind
@ TheLostMind - Спасибо. Таким образом, в синхронном методе мы блокируем поток объектов, но в то же время другой поток объектов также может иметь доступ к методу запуска. это то, что происходит там? – Murali