Java发生之前和线程安全
发布时间:2020-12-14 05:02:53 所属栏目:Java 来源:网络整理
导读:假设我有一个类包装HashMap,如下所示: public final class MyClass{ private final MapString,String map; //Called by Thread1 public MyClass( int size ){ this.map = new HashMapString,String( size ); } //Only ever called by Thread2 public final
假设我有一个类包装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”进行初始化. 我正确理解这个类是线程安全的: >由于对地图的引用被声明为final,所有其他线程都将看到地图的初始状态(事件之前建立). 谢谢 解决方法
所以你问的是正确的假设.如果您可以保证仅以这种方式使用,则不需要使线程安全.你不能在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.线程没有办法与自身发生冲突. 线程安全是一个不同的定义,其中组合实体可以安全地通过多个线程进行交互.在你描述的情况下,这种情况不会发生,因为你本质上有一个构造的线程,另一个被操纵. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |