Java中同步机制

eqoofvh9  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(125)

我需要确保我理解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同步

wsxa1bj1

wsxa1bj11#

1.如果有多个线程在运行,其中一个线程使用了foo中的synchronized代码块,那么其他线程此时是否可以访问goo(或者更具体地说,访问'a'?)?相反,如果有一个线程此时通过goo访问a(它是非同步的),那么该线程是否可以进入foo的synchronized代码块?或者它是否要等待它?
是的,目前多个线程可以同时访问这些方法,无论是哪种方式。
但是,这不是正确的代码:您需要在a上同步对a.size()的访问,以确保您看到goo中发生的数据结构的任何更新。例如,即使您使用foo向列表中添加了一些内容,foo也可能看到0的大小。
因此,您需要编写代码,使两个线程不能同时位于这些块中。

相关问题