加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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”进行初始化.
但是,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.线程没有办法与自身发生冲突.

线程安全是一个不同的定义,其中组合实体可以安全地通过多个线程进行交互.在你描述的情况下,这种情况不会发生,因为你本质上有一个构造的线程,另一个被操纵.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读