JAVA知识 简单记录-多线程
来源:互联网 发布:淘宝开书店 编辑:程序博客网 时间:2024/05/21 17:30
研究文章:
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接口- JAVA知识 简单记录-多线程
- Java多线程相关知识记录
- JAVA知识 简单记录-WebSocket
- 多线程知识记录
- Java【多线程知识总结】
- Java多线程知识
- Java知识总结-多线程
- Java多线程相关知识
- Java多线程相关知识
- Java多线程知识
- Java多线程知识整理
- Java多线程相关知识
- 【JAVA知识】多线程开发
- java 多线程相关知识
- Java 多线程知识
- java多线程知识汇总
- java多线程一些知识
- Java 多线程知识总结
- 去掉静态文件后面的jsessionid
- 自定义颜色、大小渐变的圆点指示器
- Android面试题大全
- URL中的特殊字符处理笔记
- NFC-SWP系统培训材料(总体)
- JAVA知识 简单记录-多线程
- 第40讲项目7——找数字
- Java字符串、集合
- Button OnClick
- 实现俄罗斯方块的左移,右移,加速下移和旋转
- Python:如何将字符串作为变量名
- 嵌入式 DirectFB
- SASS入门之SASS安装
- StoryBoard