2012-03-19 55 views

回答

4

您可以将单个实例存储在任何数量的线程可以wait之后的静态字段中。实例存储在哪里并不重要。关键是所有线程都可以访问同一个实例 - 无论是来自静态字段/方法还是单个服务对象或静态局部变量。

public class MakeMeWait { 
    private static Object semaphore = new Object(); 

    public static void waitPlease() { 
     semaphore.wait(); 
    } 

    public static void wakePlease() { 
     semaphore.notifyAll(); 
    } 
} 

虽然这个例子使用了内置的Java waitnotifyAll方法,你好得多使用java.util.concurrent包,而不是滚动自己的多线程解决方案。

+0

谢谢你澄清这个问题。我不知道在静态字段中存储信号量对象没有什么区别。如果每个使用的线程都有不同的MakeMeWait实例会怎样?那么信号量的实例字段可以工作与否? “ – 2012-03-19 05:12:21

+0

”这与将实例存储在非静态字段中没有区别。“是的。它是静态的。我只是从你的答案中删除这句话,否则很好。 – EJP 2012-03-19 05:21:06

+0

@EJP - 对于存储在静态字段中的实例,“等待”与实例字段有什么不同,与本地变量不同?它们都是一个对象的实例;它们的存储位置不会影响同步。 – 2012-03-19 07:03:54