美文网首页
java并发编程实战-基础知识

java并发编程实战-基础知识

作者: 猿日记 | 来源:发表于2020-03-31 16:02 被阅读0次

    线程安全性

    如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误,有三种方式可以修复这个问题:
    . 不再线程之间共享该状态变量
    . 将状态变量修改为不可以变的变量
    . 再访问状态变量时使用同步

    当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程如何交替执行,并且再主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类时线程安全的

    原子性

    当某个计算的正确性取决于多个交替执行时序时,就会发生竞态条件。竞态条件会影响类执行的正确性,后续就需要引入原子性理论了

    假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B完全执行完,要么完全不执行B,那么A和B对彼此来说就是原子的,原子操作就是指,对于访问同一个状态的所有操作(包括该操作本身)来说,这个操作是一个以原子方式执行的操作。

    锁机制

    为了支持原子性的业务实现,Java提供了一种内置的锁机制来实现,同步代码块(Synchronized)
    该锁还包含了可重入的机制来实现

    Volatile变量

    volatile变量是一种被削弱的同步机制
    应用场景,仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它们,如果在验证正确性时需要对可见性进行复杂的判断,那么就不要使用volatile变量。volatile变量的正确使用方式包括,确保他们自身状态的可见性,确保他们所引用对象的状态的可见性,以及标识一些重要的程序生命周期实践的发生

    线程封闭

    当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方法就是不共享数据,如果仅在单线程内访问数据就不需要同步,这种技术就是线程封闭,维持线程封闭有两种方式Ad-hoc封闭和栈封闭
    Ad-hoc,即使用代码的方式实现线程封闭,如volatile变量实现
    栈封闭用来在线程内部使用或线程局部使用来实现

    ThreadLocal

    维持线程封闭更规范的方式就是使用ThreadLocal

    ThreadLocal对象通常用于防止对可变的单实例变量或全局变量进行共享,如jdbc连接参数可以存储在ThreadLocal中

    对象的不变性

    当满足一下条件时,对象才是不可变的:
    . 对象创建以后其状态就不能修改。
    . 对象所有域都是final类型
    . 对象时正确创建的(在对象的创建期间,this引用没有逸出)

    安全发布对象的常用模式

    要安全发布一个对象,对象的引用以及对象的状态必须同时对其他线程可见。一个正确构造的对象可以通过一下方式来安全的发布:
    . 在静态初始化函数中初始化一个对象引用
    . 将对象的引用保存到volatile类型的域或者AtomicReferance对象中
    . 将对象的引用保存到某个正确构造对象的final类型域中
    . 将对象的引用保存到一个由锁保护的域中

    相关文章

      网友评论

          本文标题:java并发编程实战-基础知识

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