gpt4 book ai didi

java - 关于同步功能

转载 作者:行者123 更新时间:2023-11-30 06:49:55 24 4
gpt4 key购买 nike

我接受了采访,被问到一个有两个函数 m1() 和 m2() 的类。 m1() 是同步的,而 m2() 不是,两个线程 t1 和 t2 正在尝试访问该对象。现在如果 t1 正在访问 m1() 函数,那么 t2 是否可以同时访问 m2() 方法?

我说应该允许访问它,因为 m2() 方法上没有锁,但面试官坚持认为,因为锁在同一个对象上,所以不允许访问m2() 函数到 t2 线程。

为此我写了一个程序来检查,发现我说的都是对的。请查看带有输出的程序。

class myExperiment2 implements Runnable{
myThreadEx m;

myExperiment2(myThreadEx m){
this.m = m;
}

@Override
public void run() {
try {
m.m2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

class myExperiment1 implements Runnable{
myThreadEx m;

myExperiment1(myThreadEx m){
this.m = m;
}

@Override
public void run() {
try {
m.m1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

class myThreadEx{

synchronized void m1() throws InterruptedException {
System.out.println("1 am in m1....1");
Thread.sleep(10000);
System.out.println("I am in m1()");
Thread.sleep(10000);
System.out.println("1 am in m1....2");
}

void m2() throws InterruptedException{
System.out.println("1 am in m2....1");
Thread.sleep(5000);
System.out.println("i am in m2()");
Thread.sleep(5000);
System.out.println("1 am in m2....2");
}
}

public class ThreadEx {

public static void main(String args[]){
myThreadEx m = new myThreadEx();

Thread t1 = new Thread(new myExperiment1(m));
Thread t2 = new Thread(new myExperiment2(m));

t1.start();
t2.start();
}
}

输出是

1 am in m1....1
1 am in m2....1
i am in m2()
1 am in m2....2
I am in m1()
1 am in m1....2

如果我遗漏了什么,或者是否存在我可能错了而面试说的是对的情况,有人可以建议我吗?

最佳答案

除非我误解了问题,或者你没有准确地关联它,否则面试官是错的。

当然,给定the semantics of synchronized methods :

synchronized void foo() { ... }

等同于

void foo() { synchronized (this) { ... } }

(至少对于实例方法)

然后其他线程总是可以同时“访问”该方法(例如,多个线程在其堆栈跟踪中都有该方法);他们只是立即被阻止。

关于java - 关于同步功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42111592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com