Java多线程系列—线程安全问题(06)

线程安全问题

什么是线程安全

要想弄清楚线程安全问题,首先需要了解什么是线程安全,线程安全经常在工作中被提到,比如:你的对象不是线程安全的,你的线程发生了安全错误,虽然线程安全经常被提到,但我们可能对线程安全并没有一个明确的定义。

《Java Concurrency In Practice》的作者 Brian Goetz 对线程安全是这样理解的,当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行问题,也不需要进行额外的同步,而调用这个对象的行为都可以获得正确的结果,那这个对象便是线程安全的,所以说线程安全问题是针对的某一个对象而言的,而这个对象我们称之为临界资源。

事实上,Brian Goetz 想表达的意思是,如果某个对象是线程安全的,那么对于使用者而言,在使用时就不需要考虑方法间的协调问题,比如不需要考虑不能同时写入或读写不能并行的问题,也不需要考虑任何额外的同步问题,比如不需要额外自己加 synchronized 锁,那么它才是线程安全的,可以看出对线程安全的定义还是非常苛刻的。

而我们在实际开发中经常会遇到线程不安全的情况,那么一共有哪 3 种典型的线程安全问题呢?

  1. 运行结果错误
  2. 程序运行错误
  3. 活跃性问题

运行结果错误

首先,来看多线程同时操作一个变量导致的运行结果错误。

public class WrongResultCount {
     volatile static int i;

    public stati

你可能感兴趣的:(java,多线程,多线程,java,面试)