我需要确保我理解java中的同步机制,这里有几个场景我想问一下:
1.存在列表"a":列表a
并且有两个功能:
第一个
如果有多个线程在运行,其中一个线程使用了foo中的synchronized代码块,那么其他线程此时是否可以访问goo(或者更具体地说,访问'a'?)?相反,如果有一个线程此时通过goo访问a(它是非同步的),那么该线程是否可以进入foo的synchronized代码块?或者它是否要等待它?
1.要有:
void synchronized foo(){
// do stuff
notifyAll();
//do stuff
if(someStatement)
return;
wait();
//do stuff
}
某个线程进入foo并到达wait块,它释放了'this'键,对吗?第二个线程进入foo,并到达notifyAll,此时第一个等待的线程应该醒来并继续foo的代码,但这没有意义,因为另一个线程当前持有键。那么会发生什么呢?
1.要有:
class A implements Runnable {
Thread b;
foo(){
b= new Thread(()-> { /*some lambda function*/};
b.start();
}
goo(){
//here I'd like to notify the thread of b, how do I do it?
}
}
如果我想通知一个我用lambda函数创建的线程,我该怎么做?这意味着我没有对它的引用,但我有对对象'b'的引用?
先谢谢你。
这是我在学习java同步
1条答案
按热度按时间wsxa1bj11#
1.如果有多个线程在运行,其中一个线程使用了foo中的synchronized代码块,那么其他线程此时是否可以访问goo(或者更具体地说,访问'a'?)?相反,如果有一个线程此时通过goo访问a(它是非同步的),那么该线程是否可以进入foo的synchronized代码块?或者它是否要等待它?
是的,目前多个线程可以同时访问这些方法,无论是哪种方式。
但是,这不是正确的代码:您需要在
a
上同步对a.size()
的访问,以确保您看到goo
中发生的数据结构的任何更新。例如,即使您使用foo
向列表中添加了一些内容,foo
也可能看到0
的大小。因此,您需要编写代码,使两个线程不能同时位于这些块中。