同步方法同时执行



根据synchronized关键字,如果应用到方法上,那么它将获得对象锁,并且具有同一实例的多个方法将无法并发执行这些方法。

但是在下面的例子中,执行是并发发生的。请查看:-

public class ncuie extends Thread{
int b;
ncuie(int a){
b=a;
}

public synchronized void abc() throws InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println("thread 1 "+i);
}
}

public synchronized void pqr() throws InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println("thread 2 "+i);
}

}

public void run() {

try {
if(b==5) {
abc();
}
if(b==10) {
pqr();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static void main(String[] args) {
Thread t=new ncuie(5);
Thread t1=new ncuie(10);
t.start();
t1.start();
}
}

根据输出,有时执行线程1,有时执行线程2。理想情况下,只有一个线程应该获得锁并完成它的执行,然后只有第二个线程应该启动。

输出: -

thread 1 0
thread 1 1
thread 2 0
thread 2 1
thread 2 2
thread 1 2
thread 1 3
thread 1 4
thread 1 5
thread 1 6
thread 1 7
thread 1 8
thread 2 3
thread 2 4
thread 2 5
thread 2 6
thread 1 9
thread 2 7
thread 2 8
thread 2 9

您通常在您的实例上同步如果一些方法改变了内部状态,使得在同一实例上操作的其他方法就会惹上麻烦。在当前实例(this)上的同步是通过在非静态方法上使用synchronized关键字或写入synchronized(this) {...}来实现的。

如果你的方法改变了状态,即使是在不同实例上操作的方法如果类受到影响,您可以在类对象上进行同步。您可以通过写入synchronized(MyClass.class) {...}来完成此操作。

如果您的静态方法需要与同一类的其他静态方法同步,您可以通过在静态方法上使用synchronized关键字来获得类对象上的同步。

请注意,实例级同步和类级同步是完全独立的,这意味着,当类同步方法运行时,实例同步方法不会被阻塞。

在你的例子中,你在实例上同步,你有两个不同的实例,所以它们不会互相阻塞。

synchronized获取this的锁。您有两个ncuie类的实例,因此将它们同时锁定是非常好的。

要解决这个问题,你需要在线程之间共享一些实例。我建议创建新的Object并将其传递给蟒蛇。

最新更新