Java高效并发-1 java线程基础知识

来源:互联网 发布:mac怎么看系统版本号 编辑:程序博客网 时间:2024/04/29 10:01


1.Java内存模型


1.主内存与工作内存

Java内存模型规定了,所有变量的都存储在主内存中,这里的变量是指包括了实例字段,静态字段,和构成数组对象的元素
每条线程都有自己的工作内存,线程对变量的所有操作都是在工作内存中

2.内存间交互操作

虚拟机实现规定了,主内存与工作空间之间的下面八种类型的操作都是原子性的.
Lock 锁定
unlock 解锁
read读取
load载入
use使用
assign赋值
store 存储
write 写入
主内存->工作内存 read +load
工作内存-(同步到)>主内存 store + write 

执行上8种基本类型应该满足下面的原则,这些原则已经可以完全确定哪些并发执行是安全的

1.read load   store write 不能单独出现,即不允许一个变量从主内存取出,而工作内存不接受
2.不允许线程废弃最近的assign操作,即工作内存中变化了,要把变化同步到主内存中
3.不允许线程无原因的将数据同步到主内存
4.新变量必须在主内存中诞生,就是在使用use store之前,必须要assign load
5.一个变量同一时刻只有一个线程能对其lock ,
6.对变量执行lock,会清空工作内存中的值,必须重新load或assign
7.没lock不能unlock,也不能unlock其他线程lock住的变量
8.对变量进行unlock之前,先同步数据到主内存

3.volatile型变量

1.volatile对所有线程可见性

volatile型变量对于所有线程都有可见性,即volatile型的值改变后,其他线程立刻可以得知,
但是volatile只是拥有可见性,但并不是线程安全的,

package day20150804;import org.apache.commons.lang.Validate;public class ValitileTest {private static volatile int i=0;private static  void doFun(){i++;}public static void main(String[] args) throws InterruptedException {for(int i = 0;i<30;i++){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0;i<10000;i++)doFun();}}).start();}while(Thread.activeCount()>1)Thread.sleep(1000);System.out.println(i);}}

每次输出的结果都不同,都小于300000

volatile适用的情况应该是,对于一个控制状态的变量
比如 boolean型的变量,这个控制控制线程是否运行

2.禁止指令重排序

在内存中加入内存屏障,使指令不能重新排序.

1.内存使用volatile类型的变量都需要从主内存中获取最新的值
2.在工作内存中,每次改变volatile类型的变量的时候,都要立刻同步到内存中

4,long与double类型的特殊规则

如果不将这两个类型的变量声明称volatile,可能在内存获取到半个变量.但是在目前的商用虚拟机中,没有这个情况的发生


5.原子性,可见性,有序性

原子性:内存间的8个基本操作都是原子性的,java提供了synchronized来保证其他的原子性操作
可见性:变量都有可见性,但是volatile定义的可以立刻刷新,还可以提供可见性的还有同步代码块,因为unlock时会刷新数据,final标签也可以实现
有序性:synchronized和volatile标签都可以实现,


6.先行发生原则

先行发生原则与时间先后顺序关系不大.

2.Java与线程

1.线程的实现方法

1.使用内核线程实现
直接由操作系统支持的线程叫内核线程,但是我们一般不直接使用这种线程,而是去使用内核线程的一种高级接口,轻量级进程.就是我们通常意义上的线程
优势:每个轻量级线程都会成为一个独立的调度单元,即使堵塞了,也不影响整个进程工作
劣势:各种线程操作都需要进行系统调用,而系统调用代价较高,第二,一个系统支持的轻量级线程数量有限
2.使用用户线程实现
优势,快速,劣势:所有的程序都需要自己来调度,如堵塞如何处理等等
3.使用用户线程加轻量级线程混合实现
多对多线程模式java线程实现
4.java 线程实现
不同的虚拟机,有不同的方案,Windows和Linux都是一对一,而solaris是多对多和一对一都有的

7.java线程调度

协同式调度和抢占式调度
java使用的是协同式

8.状态转换

java线程有5种状态
新建 New
无限期等待 waiting
有限期等待timed waiting
阻塞 Bolcked
结束 Treminated






0 0
原创粉丝点击