引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的文章非常多,但是并没有讲解非常详细的文章.(哪位要是有好的资料麻烦共享一份给我!)多数的都是一些理论讲解,没有实际的例子代码,就算有代码的也测试不出效果,总之理论总是与代码不匹配. 后来在我不懈的努力之下总算研究出一些成果,在此分享给大家!如果大家发现有错误的地方欢迎大家指正,谢谢! 在Java线程…
Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令.   class MyTask implements Runnable {    private String mName;     public MyTask(String name) {    mName = name;   }  …
1. 缓存一致性问题 在计算机中,每条指令都是在CPU执行的,而CPU又不具备存储数据的功能,因此数据都是存储在主存(即内存)和外存(硬盘)中.但是,主存中数据的存取速度高于外存中数据的存取速度(这也就是为什么内存条的价格会高),于是计算机就将需要的数据先读取到主存中,计算机运算完成后再将数据写入到外存中. 但是,CPU的计算能力太强了,CPU从主存中读取写入数据的速度还是太慢了,严重影响了计算机的性能.因此,CPU就有了高速缓存(cache).也就是说,当程序再运行的时候,会将运算需要的数据从…
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链表是因为这些结点之间没有明显的next指针,而是通过myPred所指向的结点的变化情况来影响myNode的行为.CLHLock上还有一个尾指针,始终指向队列的最后一个结点.CLHLock的类图如下所示:       当一个线程需要获取锁时,会创建一个新的QNode,将其中的locked设置为true…
一.内存模型的相关概念 由于计算机在执行程序时都是在CPU中运行,临时数据存在主存即物理内存,数据的读取和写入都要和内存交互,CPU的运行速度远远快于内存,会大大降低程序执行的速度,于是就有了高速缓存即寄存器(工作内存). 这样在程序运行中先将运算的数据从主存中复制一份到高速缓存中,从而对高速缓存的数据进行读取.写入避免对内存的操作,完成后在将完成的数据更新到存中. 概念: 1.共享变量:多个线程会操作的变量 2.缓存不一致:一个变量在多个CPU中缓存时,当各CPU从高速缓存中更新数据到主存时.…
1.通过Unsafe类可以分配内存,可以释放内存:类中提供的3个本地方法allocateMemory.reallocateMemory.freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应.2.可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的:[java] view plaincopyprint?public native long allocateMemory(long l); public native long reallocateMemo…
1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的List) ConcurrentHashMap:分段锁机制,多线程条件下优于HashMap+synchronized的组合方式: CopyOnWriteArrayList: 每次修改时都会创建并重新发布一个新的容器副本,从而实现可变性.容器的迭代器保留一个指向底层基础数组的引用,这个数组当前位于迭代器的起…
主要概念:线程安全性.原子性.原子变量.原子操作.竟态条件.复合操作.加锁机制.重入.活跃性与性能. 1.当多个线程访问某个状态变量并且其中有一个线程执行写入操作时,必须采用同步机制来协同这些线程对变量的访问.Java中的主要同步机制是关键字synchronized,他提供了一种独占的加锁方式. 2.当设计线程安全的类时,良好的面相对象技术.不可修改性.以及明晰的不变性规范都能启动一定的帮助作用. 3.线程安全类的定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替…
ReentrantLock是一个可重入的互斥锁,ReentrantLock由最近成功获取锁,还没有释放的线程所拥有,当锁被另一个线程拥有时,调用lock的线程可以成功获取锁.如果锁已经被当前线程拥有,当前线程会立即返回.此类的构造方法提供一个可选的公平参数 public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 公平与非公平有何区别,所谓公平就是严格按照FIFO顺序获取锁,非…
一.非原子的64位操作: 当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值,这种安全性保证被称为最低安全性.最低安全性适用于绝大多数变量,但存在一个例外:非volatile类型的64位数值变量(double,long),Java内存模型要求,变量的读取和写入操作都必须是原子操作,但对于非volatile型的long,double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作,当读取一个非volatile类型的long…