Java多线程(一)
来源:互联网 发布:中国移动大数据硬件 编辑:程序博客网 时间:2024/05/21 02:35
在服务器开发中,最让人头疼的莫过于多线程之前的锁问题了。
1、
Java内存模型,由于Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。系统存在一个主内存(Main Memory), Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。主内存与工作内存分别在JVM的stack和heap区。
2、
Java中不仅每一个类的实例对应一把锁,每一个类也对应一把锁。
3、
Java的同步机制是为了解决对共享存储区的访问冲突问题,而为了解决对共享资源的访问冲突问题,Java引入了阻塞机制。
4、wait() notify() notifyall()
(1) 调用wait()阻塞线程时候会释放占用的锁。
(2) 这三个方法属于Object类,所有对象都拥有这一对方法,其他与阻塞相关的线程方法属于Thread类。
(3) 方法必须在synchronized方法或者块中调用,否则产生IllegalMonitorStateException异常。
5、
synchronized不能继承,父类的方法是synchronized的并不代表子类的方法也是synchronized的。
6、 一个线程中执行i=i+1操作的步骤分析
(1) 从主内存中读取i值到本地内存
(2) 将值从本地内存装载到线程工作拷贝中
(3) 装载变量1
(4) 将i 加 1
(5) 将结果给变量i
(6) 将i保存到线程本地工作拷贝中
(7) 写回主内存
原子型操作仅限于第一与第二步的读以及第六与第七的写。long与double变量是非原子型的。
7、volatile变量
volatile变量保证与主内存保持一致,可以用在除final变量之外的所有变量。使用volatile的两个条件:
(1) 对变量的写操作不依赖于当前值
(2) 该变量没有包含在具有其他变量的不变式中
就目前大多数的处理器架构中,volatile 读操作开销非常低 —— 几乎和非 volatile 读操作一样。而 volatile 写操作的开销要比非 volatile 写操作多很多,因为要保证可见性需要实现内存界定(Memory Fence),即便如此,volatile 的总开销仍然要比锁获取低。
参考文献
8、建议
不使用stop() destroy() suspend() resume()方法
9、
JVM对线程管理的方式是让每一个线程执行一次start()方法。
10、
在一个死去的Thread对象上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
11、
阻塞队列,阻塞栈,条件变量,原子变量,障碍器
12、
Java中的条件变量都实现了java.util.concurrent.locks.condition接口,条件变量的实例化是通过一个Lock对象上调用newCondition()方法来获取的,这也决定了Java中的条件变量必须与锁一起使用,来控制并发程序访问竞争资源的安全。
13、静态方法同步
14、ThreadLocal
参考文献
- Java多线程(一) 认识多线程
- java多线程:多线程(一)
- Java中的多线程(一)
- Java多线程编程(一)
- 深入浅出JAVA多线程(一)
- Java多线程(一)
- Java多线程一
- Java----多线程详解(一)
- Java多线程编程一
- java 多线程开发一
- java中的多线程(一)
- Java--多线程(一)
- java多线程(一)
- java多线程(一)
- java多线程技术一
- java(多线程 一)
- JAVA多线程(一)
- java多线程(一)
- 动软.net使用二三事
- Linux学习手札(二):安装Linux的基础知识
- Humble Number
- 类的反射机制
- NSKeyedArchiver的基础用法
- Java多线程(一)
- 连载:编写高效代码(5)——选用合适的指令
- 设计产品设计的一个信号产生电路
- 计算实对称矩阵特征值和特征向量
- k means 好文章
- 连载:编写高效代码(6)——降低数据精度
- 常用的SQLServerHelper类
- Oracle闪回技术1
- Oracle闪回技术2