• 技术文章 >Java >java教程

    java 线程安全和不可变性

    黄舟黄舟2017-02-28 10:38:33原创650
    竞态条件的发生只是在如果两个线程同时访问相同的资源,以及一个或者更多的线程写这个资源。如果多个线程读这个相同的资源,竞态条件不会发生。

    我们可以确定,在线程之间共享的对象通过使得这个共享的对象不可变,不会被任何的线程更新,从而是线程安全的。这里有一个例子:


    public class ImmutableValue{
    
      private int value = 0;
    
      public ImmutableValue(int value){
        this.value = value;
      }
    
      public int getValue(){
        return this.value;
      }
    }


    注意对于ImmutableValue实例的value值是怎样传递给这个构造函数的。也要注意这里没有set方法。一旦这个实例被创建了,你就不能改变它的值了。它是不可变的。然而你可以使用get方法去读取它。


    如果你需要在这个事例上执行操作,你可以使用来自操作结果的值返回一个新的实例。这里也有一个例子:


    public class ImmutableValue{
    
      private int value = 0;
    
      public ImmutableValue(int value){
        this.value = value;
      }
    
      public int getValue(){
        return this.value;
      }
    
      
          <strong>public ImmutableValue add(int valueToAdd){
          return new ImmutableValue(this.value + valueToAdd);
          }</strong>
      
    }


    注意,这个add方法返回一个新的实例伴随着这个添加操作的结果,而不是添加这个值到它自己。


    这个引用不是线程安全的

    记住这个是重要的,甚至如果一个对象是不可变的,以及从而是线程安全的,对于这个对象的引用可能不是线程安全的。看这个例子:


    public class Calculator{
      private ImmutableValue currentValue = null;
    
      public ImmutableValue getValue(){
        return currentValue;
      }
    
      public void setValue(ImmutableValue newValue){
        this.currentValue = newValue;
      }
    
      public void add(int newValue){
        this.currentValue = this.currentValue.add(newValue);
      }
    }


    这个Calculator类持有一个上面对象的引用。注意它可能通过setValue方法和add方法改变那个引用。因此,甚至如果这个类内部使用了一个不可变的对象,它自己不是不可变的,因此不是线程安全的。换句话说:这个ImmutableValue类是线程安全的,但是它的使用不是。这个就是需要记住的一些事情,什么时间尝试着通过不可变性获取线程安全。

    为了使得Calculator类线程安全,你应该在getValue(),setValue(),以及add()方法上使用synchronized关键字。那个将会有效果的。


    以上就是java 线程安全和不可变性的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:Java 线程全和共享资源 下一篇:Java内存模型的详细介绍
    PHP编程就业班

    相关文章推荐

    • Java学习总结之数组(整理分享)• Java工厂方法模式详解• 详细整理java枚举的使用总结• 带你完全掌握Java NIO(总结分享)• 一起聊聊Java常用数据类型的输入输出

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网