美文网首页
线程安全性

线程安全性

作者: 和山少年 | 来源:发表于2019-05-23 15:02 被阅读0次

线程安全性

定义

当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。

竞态条件(Race Condition)

如果由于不恰当的执行时序而出现不正确的结果,那么就称存在竞态条件。

确保线程安全性的方法

这里的方法是从对象以及属性的状态来讲,并不涉及到同步机制。

局部变量

根据Java内存模型,局部变量是存放在当前线程自己的栈中的,所以永远不会被其他线程共享,故基本类型的局部变量是线程安全的。

public class StatelessFactorizer implements servlet{
    public void service(ServletRequest req,ServletResponse resp){
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp,factors);
    }
}

注意:无状态的对象一定是线程安全的。

局部的对象引用,尽管对象是存储在共享堆中,只要确保这个对象在局部变量中无法逃逸出去,即便将对象作为方法参数存入,此时仍然线程安全的。

public void someMethod(){
  
  LocalObject localObject = new LocalObject();

  localObject.callMethod();
  method2(localObject);
}

public void method2(LocalObject localObject){
  localObject.setValue("value");
}

不可变性

防止产生竞态条件的另一个做法就是创建不可变的共享变量,从而保证对象在线程间共享时不会被修改,以此达到保证线程安全的目的。

不可变对象一定是线程安全的。

当满足以下条件时,对象才是不可变的:

  1. 对象创建以后其状态就不能修改。

  2. 对象的所有对象都是final类型。

  3. 对象是正确创建的(在对象的创建期间,this引用没有逸出)。

        public final class ThreeStooges{
             private final Set<String> stooges = new HashSet<String>();
             public ThreeStooges(){
                 stooges.add("Moe");
             }
             public boolean isStooge(String name){
                 return stooges.contains(name);
             }
         }

相关文章

  • EffectiveJava第十章第五节

    线程安全性的文档化 并非出现synchronized关键字就是线程安全性文档化了。实际上,一个类支持的线程安全性有...

  • String的线程安全

    线程安全性 说道有关string的线程安全性,大家想到的肯定时stringbuffer和stringbuilder...

  • Java并发编程 线程安全性

    什么是线程安全性 线程安全性:当多个线程访问某个类时,不管运行时采用何种调度方式或者这些线程将被如何交替执行,并且...

  • java并发编程实战2~3

    2 线程安全性 2.1 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何...

  • 谈谈并发编程中的线程安全性

    1. 线程安全性 在单线程程序中,我们并不需要去考虑线程的安全性。但是在多线程程序中,由于多个线程要共享相同的内存...

  • 线程安全性(一)

    参考线程安全性总结 CountDownLatchCountDownLatch 可以阻塞线程并保证线程在满足某种特定...

  • 高并发编程03 ~ 线程安全性

    这节我们讨论一个话题:线程安全性 一、概念 线程安全性:当多个线程同时访问某个资源的时候,不管环境采用何种调度方式...

  • 线程安全性详解

    线程安全性 线程安全性定义: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并...

  • 理解Java中的线程安全及处理方法

    1. 线程安全性 1.1. 继承方式VS实现方式(掌握) 当多线程并发访问同一个资源时,会导致线程出现安全性的原因...

  • Effective STL 第12条

    容器的线程安全性 不能对容器的线程安全性抱太大的期望 对于stl容器,大部分容器只能保证1)支持多线程同时读2)支...

网友评论

      本文标题:线程安全性

      本文链接:https://www.haomeiwen.com/subject/tftbzqtx.html