Java - SynchronizedList - 我的代码线程安全吗?

问题描述 投票:0回答:1

我的代码将在多线程上下文中工作。 不同的线程将被实例化

MyClass
.

但我也将它包装在构造函数内的

Collections.synchronizedList()
中。

这段代码线程安全吗??

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

class HelloWorld {
    public static void main(String[] args) {
        // The following whole code be run in different threads!
        List<ConcurrentHashMap<String, Object>> data = new ArrayList<>();
        ConcurrentHashMap<String,Object> hm = new ConcurrentHashMap<>();
        hm.put("nice",1);
        data.add(hm);
        
        MyClass mc = new MyClass(data); 
        System.out.println(mc.getData()); //Will i get the correct data in every thread?
    }
}

 class MyClass {
    private  List<ConcurrentHashMap<String, Object>> data = Collections.synchronizedList(new ArrayList<>());

    public MyClass( List<ConcurrentHashMap<String, Object>> data) {
        this.data = Collections.synchronizedList(data);
    }


    public List<ConcurrentHashMap<String, Object>> getData() {
        return data;
    }
}

我想确保这是线程安全的,并且每个线程都获得正确的

data
值。

java multithreading concurrency thread-safety
1个回答
0
投票

这段代码线程安全吗?

这个问题没有好的答案。

从技术上讲,您的

MyClass
类是完全线程安全的,因为它实际上是不可变的。但那又怎样呢?您的
MyClass
类不会 任何事情。这只是一个拥有
List
的东西。

从技术上讲,

List
本身是线程安全的,因为它是由
Collections.synchronizedList(...)
构造的。但那又怎样呢?仅仅因为
List
是线程安全的,并不意味着 使用 它的代码是线程安全的。

从技术上讲,列表中的

Map
实例是线程安全的,因为它们必须是
ConcurrentHashMap
实例。但那又怎样呢?仅仅因为
ConcurrentHashMap
是线程安全的,...你明白了吗?

使用它的代码怎么样?您所显示的只是一个线程,将单个项目添加到列表中,然后打印列表中包含的字符串(间接地,通过 ConcurrentHashMap)。从技术上讲,这是线程安全的,因为每个单线程程序都是线程安全的。

但那又怎样?


投票结束。如果您展示一些使用您的

MyClass
类的真实多线程代码,将考虑重新打开。

© www.soinside.com 2019 - 2024. All rights reserved.