Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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_Synchronized - Fatal编程技术网

Java 同步非最终列表

Java 同步非最终列表,java,synchronized,Java,Synchronized,据我所知,最好创建一个用于同步的最终静态对象 然而,我也读到,如果对象引用没有改变,那么它就不会有并发性问题 以下代码是否违反同步性 class Foo { private static ArrayList<Client> clients = null; public Foo() { clients = new ArrayList<>(); //add stuff to list here.. } pub

据我所知,最好创建一个用于同步的
最终静态
对象

然而,我也读到,如果对象引用没有改变,那么它就不会有并发性问题

以下代码是否违反同步性

class Foo {
    private static ArrayList<Client> clients = null;

    public Foo() {
        clients = new ArrayList<>();
        //add stuff to list here..
    }

    public void addClient(Client C) {
        synchronized(clients) {
            clients.add(C);
        }
    }
}
class-Foo{
私有静态ArrayList客户端=null;
公共食物({
clients=newarraylist();
//在此列表中添加内容。。
}
公共无效添加客户端(客户端C){
已同步(客户端){
添加(C);
}
}
}

如果客户端
ArrayList
从未直接公开(仅通过getter公开),我是否必须将客户端设置为final或创建final对象?换句话说,我从不为客户机数组提供set方法,因此引用永远不会更改。

任何创建Foo
new Foo()实例的人都会覆盖客户机数组。它绝对不是线程安全的

如果您真的希望客户端是静态的,也就是说,所有foo共享一个客户端列表,以便它收集大量的所有客户端列表,那么您只需要初始化一次

private static ArrayList<Client> clients = new ArrayList();
private static ArrayList clients=new ArrayList();

但我怀疑您希望每个Foo都有一个客户列表,在这种情况下,不要将其声明为静态的,为了清楚起见,请将其声明为最终的。(还有一些奇怪的情况,如Java Concurrency in Practice中所述,您确实必须将其声明为final。)

要使其线程安全,请更改“客户端”的声明,如下所示:

private final static List<Client> clients = new ArrayList<Client>();
private final static List clients=new ArrayList();
并像您已经做的那样使用“synchronized”

如果您对static关键字的含义感到困惑: static关键字意味着“clients”的同一实例将为所有Foo实例共享。如果删除static关键字,每个Foo实例都将有自己的“clients”实例


最后的关键字只是阻止你重新分配客户端变量。< /P>如果引用没有改变,那么为什么不把它做为最终的呢?我在这里没有看到问题,但是为什么不只是把它做成最后呢?我在想C++中的最后一个= const,这样我就不能添加任何东西给它。但是在谷歌搜索之后,我发现它不一样了。我看不出有任何理由在这里使用static,如上所述,你最好使用final,因为它是一个静态数组。静态并不意味着它不能被分配。你想要的是它是最终的。但是,如果将其设置为静态最终值,则上述代码将无法编译,因为您无法对同一成员进行2次赋值(第一次赋值为空,而不是实际数组)。是:)我希望所有foo都有一个列表,因此我将其设置为静态。我初始化了它,就像你的一样,并使它成为最终版本。我不确定,因为在C++中,我只能在构造函数或初始化列表中初始化。仍在学习java。这是一个简洁的特点。谢谢