![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java并发学习
memoryCoderC
Stay hungry ,Stay foolish。
展开
-
java并发编程实践学习(3)组合对象
一.设计线程安全的类设计线程安全类的过程应该包括下面3个基本要素确定对象状态是由哪些变量构成确定限制状态变量不受约束制定一个管理并发访问对象状态的策略 对象的状态首先要从域说起,如果对象的域都是基本类型,那么这些域就组成了对象的完整状态;如果一个域引用了其他对象,那么他的状态也包含了被引用的对象的域。 同步策略定义了对象如何协调对其的状态的访问,并且不会违反它的不变约束或是后验条件。他规定原创 2017-02-03 14:24:29 · 342 阅读 · 0 评论 -
Disruptor框架学习(为什么快)
一.锁的缺点Disruptor怎么解决悲观锁是将并行执行的代码串行化,其他线程还需要尝试着获取锁,它将比单线程执行更加慢,乐观锁要比悲观锁快上好多,但是它需要涉及操作系统。Disruptor中不使用锁,为了保证线程的安全它采用了CAS(Compare And Set/Swap)操作,它不涉及操作系统,它们直接在CPU上操作。但是它也不是没有代价。 Disruptor论文中讲述了我们所做的一个实验转载 2017-07-07 21:52:43 · 359 阅读 · 0 评论 -
java并发编程实践学习(10)死锁
安全性和活跃度通常相互制约。我们使用锁来保证线程安全,但是滥用锁可能引起锁顺序死锁。一.死锁当一个线程永远占有一个锁,而其他线程尝试去获得这个锁,那么他们将永远阻塞。当线程A占有锁L时,想要获得锁M,但是同时线程B持有M,尝试获得L,俩个线程将永远等待下去这被称作死锁(或称致命拥抱)。原创 2017-02-15 10:18:47 · 324 阅读 · 0 评论 -
java并发编程实践学习(2)共享对象
java,并发原创 2017-02-01 18:02:46 · 182 阅读 · 0 评论 -
java并发编程实践学习(9)GUI应用程序
为了维护安全,某一个任务必须运行在Swing的事件线程中。但是你不能在事件线程中执行耗时操作,以免UI失去响应。而且Swing的数据结构不是线程安全的所以你必须小心的把他们限制在事件线程中。 几乎所有的GUI工具集都是单线程化的子系统,意味着所有GUI的活动都被限制在一个单独的线程中。一.为什么GUI是单线程化的现代的GUI框架使用了一个模型:模型创建了一个专门的事件发派线程来处理GUI事件。多线原创 2017-02-14 14:00:06 · 700 阅读 · 0 评论 -
java并发编程实践学习(16)Java存储模型
一、什么是存储模型,要它何用原创 2017-02-22 22:35:53 · 208 阅读 · 0 评论 -
java并发编程实践学习(15)原子变量与非阻塞同步机制
近来很多关于并发算法的研究机构都聚焦在非阻塞算法上,这种算法使用低层原子化的机器指令取代锁,比如比较并交换一、锁的劣势当频繁发生锁的竞争时,调度与真正用于工作的开销时间的比会变得很可观。volatile变量与锁相比是更清凉的同步机制,因为他们不会引起上下文的切换和线程调度。 加锁还有其他缺点。当一个线程正在等待锁时,它不能做任何其他事情。如果一个线程在持有锁的情况下发生了延迟,如果阻塞的线程是优先原创 2017-02-22 19:55:11 · 315 阅读 · 0 评论 -
java并发编程实践学习(14 ) 构建自定义的同步工具
一.管理状态依赖性在单线程化的程序中,如果调用一个方法时,依赖于状态的先验条件为满足(比如连接池非空),那么这个先验条件就无法变为真。但是在并发程序中,基于状态的先验条件会在其他线程的活动中被改变。对于并发对象,依赖于状态的方法有时可以再不能满足先验条件的情况下选择失败,不过更好的选择是等待先验条件变为真。 有一种依赖于状态的操作,能够被阻塞直到可以继续执行。内部条件队列的机制可以让线程一直阻塞,原创 2017-02-21 15:06:16 · 354 阅读 · 0 评论 -
java并发编程实践学习(8) 应用线程池
一.任务执行策略间的隐性耦合Executor框架可以将任务的提交和执行策略解耦,但是并非能够适合所有的执行策略。有些任务需要明确指定一个执行策略:依赖性任务。如果你提交给线程池的任务要依赖于其它的任务,你就隐式的给执行策略带来了约束。这样你就必须仔细的管理执行策略以避免活跃度的问题。采用线程限制任务。单线程化的Executor相比于任意线程池,可以对同步作出更强的承诺。原创 2017-02-13 13:07:04 · 289 阅读 · 0 评论 -
java并发编程实践学习(1)线程安全
编写线程安全的代码就是管理对线程中的数据 共享是指一个变量可以被多个线程访问 可变是指变量的值可以在其生命周期内改变一.线程安全性**线程安全是指多个线程在访问一个类时,如果不需要额外的同步,这个类的行为仍然是正确的。1 无状态的对象永远是线程安全的@ThreadSafepublic class StatelessFactorizer implements servlet{ publi原创 2017-01-22 21:52:59 · 259 阅读 · 0 评论 -
java并发编程实践学习(6 )任务执行
一.在线程中执行任务顺序的执行任务显式的为任务创建线程无限制创建线程的缺点二.Executor框架使用Executor实现的Web Server执行策略线程池Executor的生命周期延迟的并具周期性的任务三.寻找可强化的并行性可携带结果的任务Callable和Future并行运行异类任务的局限性CompletionService为任务设置时限原创 2017-02-11 11:01:16 · 351 阅读 · 0 评论 -
java并发编程实践学习(13 ) 显示锁
与内部加锁机制不同,lock提供了无条件的,可轮询的,定时的,可中断的锁获取操作,所有的加锁和解锁的方法都是显示的。原创 2017-02-20 19:36:30 · 239 阅读 · 0 评论 -
java并发编程实践学习(7) 取消和关闭
一般来说线程在结束任务后自行停止,但有时也需要在自然结束前就停止它们。 安全、快速、可靠停止线程不容易。Thread.stop和suspend可以做到,但是它们有严重缺陷,应该避免使用。java提供了中断机制使一个线程要求另一个线程停止。立即停止会导致共享结构处于不一致的状态。当要求停止时,应该先清除当前进程中的工作然后再终止。原创 2017-02-12 13:08:23 · 305 阅读 · 0 评论 -
java并发编程实践学习(11)性能和可伸缩性
很多改进性能的技术同样增加了复杂度,因此增加了安全和活跃度失败的可能性。11.1性能的思考无论是CPU周期、内存、网络带宽、I/O带宽、数据库请求、磁盘空间、以及其他一些资源。当活动因某个特定资源受阻时,我们称之为受限于该性能资源:受限于CPU,受限于数据库。 但是与单线程方法相比,使用多线程总会引入一些性能的开销:包括与协调相关的开销(加锁,信号,内存同步),增加上下文切换,线程的创建和消亡,以原创 2017-02-16 09:20:47 · 293 阅读 · 0 评论 -
java并发编程实践学习(5)构建块为计算结果建立高效,可伸缩的高速缓存
几乎每一个服务器应用程序都会使用某种形式的高速魂村。复用已有的计算结果可以缩短等待时间,提高吞吐量,代价是占用更多的内存。原创 2017-02-11 00:09:29 · 254 阅读 · 0 评论 -
java并发编程实践学习(4)构建块
一.同步容器同步容器包括俩部分Vector和HashTable,这些类由Collection.synchronizedxxx工厂方法创建,这些类通过封装他们的状态,并对每一个公共方法进行同步而实现了线程的安全,这样一次只能有一个线程访问容器的状态。1.同步容器中的问题同步容器都是线程安全的。但是对于复合操作有时你可能需要使用额外的客户端加锁进行保护。这些复合操作即使没有客户端加锁技术上是线程安全的,原创 2017-02-09 12:04:48 · 307 阅读 · 0 评论 -
缓存行、cpu伪共享和缓存行填充
由于在看disruptor时了解到缓存行,以及缓存行填充的问题,所以各处了解记在这里一、缓存行CPU 为了更快的执行代码。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的 CPU ,高速缓存行大小不同。如 X86 是 32BYTES ,而 ALPHA 是 64BYTES 。并且始终在第 32 个字节或第 64 个字节处对齐。这样,当 C转载 2017-07-07 23:23:35 · 4327 阅读 · 0 评论