expr在java中synchronized(expr){}中的意义
据我所知,我们在java中使用“synchronized statement”来阻止多线程之间的干扰。expr在java中synchronized(expr){}中的意义,java,multithreading,synchronization,Java,Multithreading,Synchronization,据我所知,我们在java中使用“synchronized statement”来阻止多线程之间的干扰。 现在我试图理解expr在以下表达式中的意义。 已同步(expr){ 声明 } 因为看起来锁定行为取决于expr对象 e、 g 公共类同步扩展线程{ 静态int[]arr={0,1,2}; 对象锁=新对象(); 公共静态void main(字符串[]args){ Sync ob1=新同步(); Sync ob2=新同步(); ob1.start(); ob2.start(); } @凌驾 公开募
现在我试图理解expr在以下表达式中的意义。
已同步(expr){ 声明 } 因为看起来锁定行为取决于expr对象
e、 g
公共类同步扩展线程{
静态int[]arr={0,1,2};
对象锁=新对象();
公共静态void main(字符串[]args){
Sync ob1=新同步();
Sync ob2=新同步();
ob1.start();
ob2.start();
}
@凌驾
公开募捐{
同步(arr){
对于(int i=0;i
现在在上面的示例中,当我在synchronized语句(synchronized(arr))中使用“arr”对象时,我得到了如下一致的预期输出线程-0 0
线程-01
线程-0 2
线程-10
线程1
线程1 2
但当我在synchronized语句(synchronized(lock))中使用“lock”对象时,得到的输出如下 线程-0 0
线程-10
线程-01
线程1
线程-0 2
螺纹-12
两种情况下的输出不应该相同。
谢谢,
Shantanu
arr对象
本质上是静态的,因此两个线程共享相同的arr,如果lock是实例对象
,它将在两个线程中有两个不同的实例
因此,当您在这里与arr对象同步时,任何首先进入持有arr对象
锁的块并将完成其执行的线程,其他线程将等待第一个线程完成或释放锁
对于lock对象,它是两个不同的对象(两个资源),因此每个线程持有不同资源或对象的锁,因此执行将是并行的
public class Sync extends Thread {
static int [] arr = {0,1,2};
Object lock = new Object();
public static void main(String[] args){
Sync ob1 = new Sync();
Sync ob2 = new Sync();
ob1.start();
ob2.start();
}
@Override
public void run() {
synchronized (arr) {
for(int i = 0;i < arr.length; ++i){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + arr[i]);
}
}
}
}