Back to Posts

JAVA并发编程实战笔记——线程安全?

Posted in MultiThread

线程安全问题?

原书里面给的定义:某个类的行为与其规范完全一致。(反过来说,就是竞态条件下,类的方法不会出现预料以外的结果)

那么什么时候会出现类的行为与其规范不一致?

  • 竞态 Java提供了多线程,也就是说任意方法都会被并发访问,但又不是所有方法都会被多个线程并发访问到(如果以我自己经验来说,也就单例的getInstance方法有可能会被多线程并发调用);
    所以第一步应该明确自己业务中哪些方法的调用会存在竞态;
  • 竞态下资源更新
    如果这个方法存在竞态,而该方法本身又不涉及到更新操作,比如:
    pubulic int get() {
      return 1;
    }
    

    这个方法就算被N个线程并发访问,也不会有安全问题。。。 如果返回的是一个final类型的,也不会有安全问题。。。

如果一个方法本身涉及到一个资源的更新(类中某个变量的赋值、修改之类的操作),出现了竞态,那么就有可能出现线程安全问题;
比如前一篇中的情况就是线程不安全的;

  • 竞态下不可避免的资源更新——同步 如果一个方法存在竞态,可以尽量将更新的资源放到外面;如果不可避免,则需要使用同步; 在前一篇里面使用了synchronized实现同步,实际上还有volatile、Atomic、ReentrantLock同步机制。

你看那个人好像一条狗啊

Read Next

i++线程安全问题