研究文章:
http://www.cnblogs.com/dolphin0520/p/3920373.html
http://blog.csdn.net/escaflone/article/details/10418651
一、内存模型概念:
程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
二、并发编程中三个概念:
1、原子性 2、可见性 3、有序性
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:即程序执行的顺序按照代码的先后顺序执行。
三、java 内存模型
Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存
四、volatile 关键字
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
volatile 具有可见性和有序性,不具有原子性.
volatile原理与机制:
1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2)它会强制将对缓存的修改操作立即写入主存;
3)如果是写操作,它会导致其他CPU中对应的缓存行无效。
五、synchronized 加锁机制
- public synchronized String pop(){
- this.notifyAll();// 唤醒对象等待池中的所有线程,可能唤醒的就是 生产者(当生产者发现产品满,就会进入对象的等待池,这里代码省略,基本略同)
- while(index == -1){//如果发现没产品,就释放锁,进入对象等待池
- this.wait();
- }//当生产者生产完后,消费者从this.wait()方法再开始执行,第一次还会执行循环,万一产品还是为空,则再等待,所以这里必须用while循环,不能用if
- String good = buffer[index];
- buffer[index] = null;
- index--;
- return good;// 消费完产品,退出。
- }
六、高级同步机制
1、Lock接口
2、ReadWriteLock
3、ReentrantLock 和 ReentrantReadWriteLock 实现类
- public class LockIdGenrator{
- //new ReentrantLock(true)是重载,使用更加公平的加锁机制,在锁被释放后,会优先给等待时间最长的线程,避免一些线程长期无法获得锁
- private int ReentrantLock lock = ReentrantLock();
- privafte int value = 0;
- public int getNext(){
- lock.lock(); //进来就加锁,没有锁会等待
- try{
- return value++;//实际操作
- }finally{
- lock.unlock();//释放锁
- }
- }
- }
七、多线程的实现方式:
a、Callable接口
b、Future接口