【Java并发编程(一)】并发设计原理
一、并发设计原理
1. 基本概念
1.1 并发和并行
1.2. 同步
同步方式有两种:
- 控制同步:当一个任务的开始依赖于另一个任务的结束时,第二个任务不能在第一个任务完成之前开始。
- 数据访问同步:当两个或更多任务访问共享变量时,任意时间里,只有一个任务可以访问该变量。
与同步密切相关的一个概念是临界段。临界段是一段代码,由于它可以访问共享资源、因此在任何给定的时间内,只能够被一个任务执行。
互斥是用来保证这一要求的机制,而且可以采用不同的方式来实现。
并发系统中有不同的同步机制。
- 信号量
- 监视器
线程安全:如果共享数据的所有用户都受到同步机制的保护,那么代码就是线程安全的。
1.3 不可变对象
不可变对象初始化后,不能修改其可视状态(其属性值)。如果想修改一个不可变对象,就必须创建一个新的对象。
不可变对象的主要优点在于它是线程安全的。
1.4 原子操作和原子变量
与应用程序的其他任务相比,原子操作是一种发生在瞬间的操作。在并发应用程序中,可以通过一个临界段来实现原子操作,以便对整个操作采用同步机制。
原子变量是一种通过原子操作来设置和获取其值的变量。
1.5 共享内存与消息传递
任务可以通过两种不同的方法来互相通信:
- 共享内存: 任务在读取和写入值的时候使用相同的内存区域。为了避免出现问题,对该共享内存的访问必须在一个由同步机制保护的临界段内完成。
- 信息传递: 当一个任务需要与另一个任务通信时,它会发送一个遵循预定义协议的消息。如果发送方保持阻塞并等待响应,那么该通信就是同步的;
如果发送方在发送消息后继续执行自己的流程,那么该通信就是异步的。
2. 并发应用程序中可能出现的问题
2.1 数据竞争
如果有两个或者多个任务在临界段之外对一个共享变量进行写入操作,没有使用任何同步机制,那么应用程序可能存在数据竞争。
2.2 死锁
当两个或多个任务在等待必须由另一线程释放的某个共享资源,而该线程又正在等待必须由前述任务之一释放的另一共享资源时,并发应用程序就出现了死锁。
Coffman条件:
- 互斥
- 占有并等待条件
- 不可剥夺
- 循环等待
避免死锁的机制: - 忽略它们
- 检测
- 预防
- 规避
2.3 活锁
如果系统中有两个任务,它们总是因对方的行为而改变自己的状态,那么就出现了活锁。最终结果是它们陷入了状态变更的循环而无法继续向下执行。
2.4 资源不足
当某个任务在系统中无法获取维持其继续执行所需的资源时,就会出现资源不足。解决资源不足需要确保公平原则。
2.5 优先权反转
当一个低优先权的任务持有了一个高优先级任务所需的资源时,就会发生优先权反转。这样的话,低优先权的任务就会在高优先权的任务之前执行。
3. 并发设计模式
3.1 信号模式
public void task1(){section1();
commonObject.notify();
}
public void task2(){commonObject.wait();
section2();
}
3.2 会合模式
public void task1(){section1_1();
commonObject1.notify();
commonObject2.wait();
section1_2();
}
public void task2(){section2_1();
commonObject2.notify();
commonObject1.wait();
section2_2();
}
3.3互斥模式
public void task(){preCriticalSection();
try{lockObject().lock();//临界段开始criticalSection();
}catch(Exception e){}
finally{lockObject().unlock();//临界段结束postCriticalSecion();}
}
3.4多元复合模式
public void task(){preCriticalSection();semaphoreObject.acquire();criticalSection();semaphoreObject.release();postCriticalSecion();
}
3.5 栅栏模式
public void task(){preSyncPoint();barrierObject();postSyncPoint();
}
3.6 双重检查锁定模式
3.7 读-写锁模式
3.8 线程池模式
3.9 线程局部存储模式
【Java并发编程(一)】并发设计原理相关推荐
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- 【Java并发编程】并发编程大合集
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...
- 【檀越剑指大厂--并发编程】并发编程总结
并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...
- 并发编程——JUC并发编程知识脑图
摘要 并发编程在软件编程中尤为突出和重要,在当今面试或工作中也是不可缺少的.作为一名高级java开发工程师,并发编程的技能已经成为了重要的一项.本博文将详细介绍并发编程中的知识点和知识脑图,帮助大家更 ...
- java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
- java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理
" Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的 ...
- Java并发编程—定时器Timer底层原理
原文作者:妮蔻 原文地址:Java并发编程笔记之Timer源码分析 目录 一.timer问题复现 二.Timer 实现原理分析 timer在JDK里面,是很早的一个API了.具有延时的,并具有周期性的 ...
- Java并发编程进阶——并发锁
1 JAVA 多线程锁介绍 1.1 悲观锁 定义:悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改(很悲观),所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于 ...
- 学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...
最新文章
- Silverlight:如何在程序中获取网站的根目录
- 突发灵感,看到某网站的搞笑图片挺多,做了一个小java,扫描抠了一些
- 一个用JAVA实现的线段树类--泛型 重构.
- Weex学习资料整合
- qt mysql 清空表格_qt删除数据库中的表
- 《C专家编程》第二章——这不是Bug,而是语言特性
- iOS Abort问题系统性解决方案
- 知乎高赞:如果你是一个 Java 面试官,你会问哪些问题....
- UVA 558 SPFA 判断负环
- Kotlin入门(22)适配器的简单优化
- 【MySql】100问
- 混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法
- GNU make manual 翻译( 一百二十四)
- 走迷宫 6 6 c语言,游戏迷宫的实现
- ADAS/AD控制器模块开发03 - 系统架构设计及通用需求定义
- 分而治之,大型文件分片上传
- Android日历阴阳历转换的实现(包括日期选择器)
- 计算机的组策略配置在什么时候生效,修改组策略生效时间
- 利用screen命令将程序挂在linux后台
- 免费内网穿透端口映射工具-网络通