Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确同步/锁定变量?_Java_Multithreading_Locking_Thread Synchronization - Fatal编程技术网

Java 如何正确同步/锁定变量?

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

我在理解Java中的synchronized(){}时遇到问题。不知何故,我认为synchronized(这个)我锁定了这个类的实例,如果我想从另一个线程访问这个特定实例的属性或调用一个函数,那么这个另一个线程必须等到synchronized结束。不知怎的,在这个示例代码中它不起作用。 我希望线程A等到线程B执行某个操作后再继续

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篇关于同步的文章,但没有人提到它只针对同一个对象。。简单的解释,但我终于明白了同步的作用!非常感谢:)我现在就去看一下,然后通知。也许这会解决我的问题:)