
高并发编程
打工人笔记
点滴积累方有为,每步思索可致远。
展开
-
JAVA基础篇-使用循环CAS实现原子操作
JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止,以下代码实现了一个基于CAS线程安全的计数器方法safeCount和一个非线程安全的计数器count。package chapter02;import java.util.ArrayList;import java.util.List;import j...原创 2017-06-30 09:36:12 · 811 阅读 · 0 评论 -
JAVA基础篇-数据依赖性含义
如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列3种类型,如表3-4所示。上面3种情况,只要重排序两个操作的执行顺序,程序的执行结果就会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。这里所说的数据依赖性仅针对...原创 2017-07-05 15:17:45 · 3658 阅读 · 1 评论 -
JAVA基础篇-锁的升级与对比
Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率,下文会详细分析。1.偏...原创 2017-06-26 12:22:31 · 539 阅读 · 0 评论 -
JAVA基础篇-synchronized的实现原理与应用
在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。本文详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以...原创 2017-06-26 10:13:03 · 470 阅读 · 0 评论 -
JAVA基础篇-volatile的定义与实现原理
Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。在了解volatile实现原理之前,我们先来看下与其实现原理相关的C...原创 2017-06-26 10:07:07 · 2512 阅读 · 0 评论 -
JAVA基础篇-线程死锁例子
锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。让我们先来看一段代码,这段代码会引起死锁,使线程t1和线程t2互相等待对方释放锁。线程锁住的其实是synchronized后面的对象,当同一个对象被多个线程锁住时就会发生死锁现象。package chapter01;//死...原创 2017-06-22 18:34:01 · 834 阅读 · 0 评论 -
JAVA基础篇-多线程一定快吗
下面的代码演示串行和并发执行并累加操作的时间,请分析:下面的代码并发执行一定比串行执行快吗?package chapter01;//并发和单线程执行测试public class ConcurrencyTest { /** 执行次数 */ private static final long count=10000l; public static void main(Stri...原创 2017-06-22 12:17:17 · 1377 阅读 · 0 评论 -
减少上下文切换实战
本文将通过减少线上大量WAITING的线程,来减少上下文切换次数。第一步:用jstack命令dump线程信息,看看pid为3117的进程里的线程都在做什么。jstack 31177 > /home/dump17第二步:统计所有线程分别处于什么状态,发现300多个线程处于WAITING(onobjectmonitor)状态。[root@home]$ grep java.lang.原创 2017-06-22 13:17:58 · 1055 阅读 · 0 评论 -
Thread.join()的用法
thread.join()是让当前线程block住,等thread执行完之后,再继续执行 。比如有3个线程在执行计算任务,必须等三个线程都执行完才能汇总,那么这时候在主线程里面让三个线程join,最后计算结果既可,代码显示如下:package chapter01;import java.util.Random;//thread.join()用于停止当前线程而运行别的线程public c原创 2017-06-22 10:40:12 · 867 阅读 · 0 评论 -
JAVA基础篇-原子操作的实现原理
原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。1.术语定义在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。2.处理器如何实现原子操作32位IA-32处理器使用...原创 2017-06-28 09:38:39 · 15508 阅读 · 1 评论