Java发生之前和线程安全

前端之家收集整理的这篇文章主要介绍了Java发生之前和线程安全前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个类包装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.线程没有办法与自身发生冲突.

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

猜你在找的Java相关文章