2017-10-14 62 views
0

我有一个理解Java中synchronized(){}的问题。不知何故,我认为同步(this)我锁定了这个类的实例,如果我想访问一个属性或从另一个线程调用这个特定实例的函数,比这个其他线程必须等待,直到同步结束。在这个示例代码中,它不工作。 我希望线程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继续阅读。

我读了很多关于这个主题,但我无法理解它像100%。希望有人能向我解释那个简单的项目。

回答

1

你有什么不同步,这不是锁定您使用该对象的错误认识,但它使用对象作为一个信号锁定一块exeutable代码。你的榜样:

synchronized (this){ 
    loaded = true; 
} 

只锁定一个衬里“加载=真”。它可以防止另一个线程可以输入相同的代码行。它在“同步(本)”语句中等待,直到第一个线程(拥有信号量)离开该块,释放信号量。

你的问题是一个多线程如何等待,大约在其他线程的事件通知。有很多不同的技术可以做到这一点。现代的(java8)是使用CompletableFuture。另一个,更在java的根源是wait()和notify(),它们都是每个对象(及其派生)所知道的方法。我已经提供了后者在this SO answer

+0

一个简单的例子,我读3篇有关同步,但没有一个人提到,其只对同一个对象..容易解释,但最后我明白做什么同步!非常感谢:))现在请看看现在等待通知。也许这是要解决我的问题:) – ScriptWorld