美文网首页
Java并发编程实战读书笔记之线程安全性

Java并发编程实战读书笔记之线程安全性

作者: 程序员小白成长记 | 来源:发表于2020-08-30 12:18 被阅读0次

一、术语

  • 有状态(无状态)
  • 线程安全
  • 原子性
  • 竞态条件

要编写线程安全的代码,其核心是要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问。

  • “共享”意味着变量可以由多个线程同时访问
  • “可变”则意味着变量的值在其生命周期内可以发生变化。

如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题。

  • 不在线程之间共享该状态变量
  • 将状态变量修改为不可变的变量
  • 在访问状态变量时使用同步

【重要定义】

二、线程安全

2.1 线程安全的定义

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

2.2 线程安全知识点

当在无状态的类中添加一个状态时,如果该状态完全由线程安全的对象管理,那么这个类仍然是线程安全的(eg:使用AtomicLong来管理类计数变量)

当在不变性条件中涉及多个变量时,各个变量之间并不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。因此,当更新某一个变量时,需要在同一个原子操作中对其他变量同时进行更新。
要保持状态的一致性,就需要在某个单个原子操作中更新所有相关的状态变量。

三、原子操作

原子操作是指,对于访问同一个状态的所有操作(包括操作本身)来说,这个操作是一个以原子方式执行的操作

当在不变形条件中涉及多个变量时,各个变量之间并不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。因此,当更新某一个变量时,需要在同一个原子操作中对其他变量同时进行更新。

如果只是每个方法都是同步方法,eg:Vector,那么并不足以确保Vector上符合操作都是原子的

四、锁

锁技术可以用来保证原子性和保护状态

Java提供了一种内置锁机制来支持原子性,同步代码块(Synchronized Block)
并发环境中的原子性和事务应用程序中的原子性有着相同的含义——一组语句作为一个不可分割的单元被执行

使用锁时应尽量缩小锁范围

相关文章

网友评论

      本文标题:Java并发编程实战读书笔记之线程安全性

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