假设我有一个类包装HashMap,如下所示:
public final class MyClass{ private final Map<String,String> map; //Called by Thread1 public MyClass( int size ){ this.map = new HashMap<String,String>( size ); } //Only ever called by Thread2 public final String put( String key,String val ){ return map.put( key,value ); } //Only ever called by Thread2 public final String get( String key ){ return map.get( key ); } //Only ever called by Thread2 public final void printMap( ){ //Format and print the contents of the map } }
该类通过“Thread1”进行初始化.
但是,put,get,printMap等操作只能由“Thread2”调用.
我正确理解这个类是线程安全的:
>由于对地图的引用被声明为final,所有其他线程都将看到地图的初始状态(事件之前建立).
>由于put / get / printMap / etc只能由Thread2调用,所以不需要互斥.
谢谢
解决方法
所以你问的是正确的假设.如果您可以保证仅以这种方式使用,则不需要使线程安全.你不能在java中传递一半的构造对象,所以“构造函数可能没有被完成”是不可能的.
所以如果你这样做
new Thread(new Runnable() { public void run() { final MyClass instance = new MyClass(10); new Thread(new Runnable() { public void run() { instance.put("one","one"); .... } }).start(); } }).start();
你很好:)这是你描述的,由Thread1创建,但只用于Thread2.线程没有办法与自身发生冲突.
线程安全是一个不同的定义,其中组合实体可以安全地通过多个线程进行交互.在你描述的情况下,这种情况不会发生,因为你本质上有一个构造的线程,另一个被操纵.