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

参考文献

 

 

 

原创粉丝点击