同步方法不阻塞其他线程

时间:2016-05-11 18:38:39

标签: java multithreading java-8 synchronized java-threads

我有一个像这样的单身人士课程:

private static StringsHandler INSTANCE = null;
private int count = 0;
//I have 2 methods so I don't have to be sending/checking nulls on getInstance
//once it's created
public static void createInstance(List<String> strings){
    if(StringsHandler.INSTANCE == null)
        StringsHandler.INSTANCE = new StringsHandler(strings);
}

public static StringsHandler getInstance(){
    return StringsHandler.INSTANCE;
}

public synchronized File use(){
    count++;
    System.out.println("threads using .use " + count);
    while(true){} //Keep the thread here so count should stay as 1
}

在应用程序主类上创建实例,main方法如下:

if(stringList.isEmpty()){
        LOGGER.error("List was empty");
        System.exit(0);
    }
StringsHandler.createInstance(stringList);

我用这样的东西来称呼它:

list.parallelStream().forEach(element -> {
    SingletonClass.getInstance().use();
});

这应打印threads using .use 1,但它会打印threads using .use 5为什么synchronized关键字允许超过1个帖子?

1 个答案:

答案 0 :(得分:2)

use关键字只允许一个线程锁定使用它的特定对象。因此,如果您有多个此对象的实例,并且同时在多个实例上调用$("#exp0").find("input").each(function () { if ($(this).val() === '') { ... } }); ,则它们将能够同时执行。

您有责任决定并始终如一地执行数据元素到排除方法的映射。如果多个排除方法保护相同的数据元素,那么您将无法获得正确的排除。