Java 如何正确同步/锁定变量?
我在理解Java中的synchronized(){}时遇到问题。不知何故,我认为synchronized(这个)我锁定了这个类的实例,如果我想从另一个线程访问这个特定实例的属性或调用一个函数,那么这个另一个线程必须等到synchronized结束。不知怎的,在这个示例代码中它不起作用。 我希望线程A等到线程B执行某个操作后再继续Java 如何正确同步/锁定变量?,java,multithreading,locking,thread-synchronization,Java,Multithreading,Locking,Thread Synchronization,我在理解Java中的synchronized(){}时遇到问题。不知何故,我认为synchronized(这个)我锁定了这个类的实例,如果我想从另一个线程访问这个特定实例的属性或调用一个函数,那么这个另一个线程必须等到synchronized结束。不知怎的,在这个示例代码中它不起作用。 我希望线程A等到线程B执行某个操作后再继续 public class A implements Runnable{ public void start(){ Thread t = new Thread(t
public class A implements Runnable{
public void start(){
Thread t = new Thread(this);
t.start();
}
public void run(){
B b = new B();
b.start();
//DO STUFF
while(b.loaded){
//WAIT FOR B DOING STUFF
}
//GO ON DOING STUFF
}
}
public class B implements Runnable {
public boolean loaded;
public B(){
loaded = false;
}
public void start(){
Thread thread = new Thread(this);
thread.start();
}
public void run(){
//DOING STUFF
synchronized (this){
loaded = true;
}
//DO OTHER STUFF
}
}
如果我执行一个名为
public synchronized boolean getLoaded(){return loaded;}
但为什么写作和阅读过程必须同步?如果对象只在写入时被锁定,那么读取无论如何都必须等待,这难道还不够吗?在第一个示例中,我希望编程人员完成以下工作:
线程A正在读取加载的变量
线程B希望写入加载的变量,但其已同步,因此它锁定了对象
线程A尝试读取加载的变量,但对象被锁定,因此等待
线程B写入变量
线程B解锁
线A一直在读
我读了很多关于这个话题的书,但我不能百分之百地理解它。希望有人能向我解释一下这个简单的项目。你对synchronize的作用有错误的理解,它不是锁定你使用的对象,而是使用该对象作为信号量来锁定一段可执行代码。你的例子是:
synchronized (this){
loaded = true;
}
只需锁定一行程序“loaded=true”。它防止另一个线程可以输入同一行代码。它在“synchronized(this)”语句中等待,直到第一个线程(拥有信号量)通过释放信号量离开块
您的问题更多的是一个线程如何等待并被通知其他线程中的事件。有很多不同的技术可以做到这一点。现代的java8就是使用一个完全的未来。另一个更深入java的根,是pair wait()和notify(),这两个方法都是每个对象(及其派生)都知道的。我在中提供了后者的一个简单示例,我读了3篇关于同步的文章,但没有人提到它只针对同一个对象。。简单的解释,但我终于明白了同步的作用!非常感谢:)我现在就去看一下,然后通知。也许这会解决我的问题:)