Java并发理论简介
这些文字来自于Java程序员修炼之道,记录一下
一、 java线程模型
Java线程模型建立在两个基本概念之上
- 共享的,默认可见的可变状态
- 抢占式线程调度
我们从侧面思考一下这两个概念
- 所有线程可以很容易地功效统一进程中的对象
- 能够引用这些对象的任何线程都可以修改这些对象
- 线程调度程序差不多任何时候都能在核心上调入或调出线程
- 必须能调出运行时的方法,否则无限循环方法会一直占用CPU
- 为了保护脆弱的数据,对象可以被锁住
二、设计理念
- 安全性(并发类型安全性)
- 活跃性
- 性能
- 重用性
1、安全性与并发类型安全性
安全性是指不管同时发生多少操作都能确保对象保持自相一致。如果一个对象系统具备这一特性,那它就是并发类型安全的。
保证安全:
保证安全的策略之一就是处于非一致状态时绝不能从非私有方法中返回,也绝不能调用任何非私有方法,而且也绝不能调用其他任何对象中的方法。如果把这个策略跟某种对非一致对象的保护方法(比如同步锁或临界区)结合起来,就可以保证系统是安全的(不大理解)
2、活跃度
在一个活跃的系统中,所有做出尝试的活动最终或者取得进展,或者失败
三、原则互相冲突
设计原则经常相互对立
- 安全性与活跃性相互对立---安全性确保坏事不会发生,活跃度要求见到进展
- 可重用性的系统倾向于对外开放其内核,可这会引发安全问题
- 一旦安全但编写方式幼稚的系统性能通常都不会太好,因为里面会用大量的锁来保证安全性
- 尽可能限制子系统之间的通信。隐藏数据对安全性非常有帮助
- 尽可能保证子系统内部结构的确定性。比如说,即便子系统会以并发的、非确定性的方式进行交互,子系统内部的设计也应该参照线程和对象的静态知识
- 采用客户端应用必须遵守的策略方针
- 在文档中记录所要求的行为
Java并发理论简介的更多相关文章
- JAVA并发理论与实践
JDK5.0中更灵活.更具可伸缩性的锁定机制 流行的原子 非阻塞算法简介
- Java 并发理论简述
一:为什么需要多线程? 线程是Java语言中不可或缺的重要部分,它们能使复杂的异步代码变得简单,简化复杂系统的开发:能充分发挥多处理器系统的强大计算能力.多线程和多进程的区别与选择可以参考我的另一篇博 ...
- java 并发——CountDownLatch
java 并发--CountDownLatch 简介 public class CountDownLatch { private final Sync sync; private static fin ...
- java 并发——ReentrantLock
java 并发--ReentrantLock 简介 public class ReentrantLock implements Lock, java.io.Serializable { // 继承了 ...
- java 并发——AbstractQueuedSynchronizer
java 并发--AbstractQueuedSynchronizer 简介 abstract class AbstractQueuedSynchronizer extends AbstractOwn ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- [Java并发编程(四)] Java volatile 的理论实践
[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...
- 【Java并发.1】简介
继上一本<深入理解Java虚拟机>之后,学习计划里的另一本书<Java并发编程实战>现在开始学习,并记录学习笔记. 第一章主要内容是介绍 并发 的简介.发展.特点. 编写正确的 ...
随机推荐
- C++入门经典-例8.5-多重继承
1:C++允许子类从多个父类继承公有的和受保护的成员,这称为多重继承. 2:多重继承的定义.多重继承有多个基类名称标识符,其声明形式如下: class 派生类名标识符:[继承方式] 基类名标识符1,. ...
- 一本学习HTTP很好的书《图解HTTP》
网上电子版的一堆(*^__^*) 嘻嘻……
- LeetCode 73. 矩阵置零(Set Matrix Zeroes)
题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [ [1,1,1], [1,0,1], [1,1,1 ...
- phpstorm 比较修改过的代码 version control
- redux 第二部分
redux 的使用方法, 为什么使用 action.js 文件,进行优化代码将其分开,然后我们通过工厂函数的每次返回不同的对象,由于参数是固定的,每次返回的都是事件类型和事件数据,所以我们可以使用一个 ...
- CentOS7 磁盘管理
一.磁盘查看 查看所有磁盘 ll /dev/sd* 不带数字的为磁盘,带数字的为磁盘的分区 查看所有磁盘的分区情况 fdisk -l 结果 WARNING: fdisk GPT support is ...
- koa 项目实战(五)全球公用头像的使用
1.安装模块 npm install gravatar --save 2.使用 根目录/routes/api/users.js const gravatar = require('gravatar') ...
- leetcode315 计算右侧小于当前元素的个数
1. 采用归并排序计算逆序数组对的方法来计算右侧更小的元素 time O(nlogn): 计算逆序对可以采用两种思路: a. 在左有序数组元素出列时计算右侧比该元素小的数字的数目为 cnt=r-mid ...
- 操作系统-Windows:UWP(Universal Windows Platform)
ylbtech-操作系统-Windows:UWP(Universal Windows Platform) 1.返回顶部 1. UWP即Windows 10中的Universal Windows Pla ...
- mongodb游标的使用
1.插入数据 ;i<;i++){ db.shop.insert({_id:i+,name:+i}) } 2.查看数据数 db.shop.find().count() 3.获取游标.判断是否还存在 ...