jvm-并发编程

来源:互联网 发布:绘制仓库平面图软件 编辑:程序博客网 时间:2024/06/02 02:06
并发编程


java内存模型:定义程序中各个变量的访问规则。
变量:实例子段、静态子段和构成数组对象的元素。


两大块:工作内存,主内存




基本概念:
1、所有的变量都存储在主内存中。
2、主内存:所有的公共数据。
3、工作内存:线程使用的变量和主内存中的副本。
4、线程对变量的操作都是在工作内存中的,无法直接操作主内存。
5、不同的线程之间也不能进行互相访问。


内存间交互操作
1、lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占状态。
2、unlock(解锁):作用于内存变量,把一个处于锁定的变量释放出来,释放后其他线程可以访问。
3、read(读取):作用于主内存变量,把主内存中额变量传输到线程的工作内存中
4、load(载入):作用于工作内存,将读取的变量放入工作内存的变量副本中。
5、user(使用):作用于工作内存,将工作内存中的变量传递给执行引擎。
6、assign(赋值):作用于工作内存,获取执行引擎返回的值,放入工作内存。
7、store(存储):作用于工作内存,把工作内存中的变量返回给主内存。
8、write(写入):作用于主内存中的变量,把工作内存中返回的变量放入主内存中。


volatitle型变量:新的值能够立即同步到主内存,每次使用前都需要从主内存中刷新最新的值。


特性:
1、此类型变量对所有的线程是可见的,一条线程修改了变量值,其他线程会马上得知。
2、变量值在线程间传递需要通过主内存完成。

总结:java内存模型是围绕这并发过程中如何处理原子性、可见性和有序性建立的。


原子性:
可见性:volatile、synchronized和final




java与线程


实现线程的三种方式:
1、使用内核线程实现
2、使用用户线程实现
3、使用用户线程加轻量级进程混合实现。


java线程调度:系统为线程分配处理器使用权利的过程。
1、协同式线程调度:线程执行的时间由线程本身控制,线程自己的工作执行完后要主动通知系统切换到其他线程。
2、抢占式线程调度

状态转换
1、新建(new):新建但是没有启动
2、运行(runable):正在执行或者等待CPU分配执行时间。
3、无限期等待(waiting):不会被CPU分配时间,要等待其他线程显示唤醒。
进入无限期等待:
1、没有设置Timeout参数的Object.wait()方法
2、没有设置Timeout参数的Object.join()方法
3、LockSupport.pack()方法
4、有限期等待(timed waitting):不会被CPU分配时间,要等待一定时间后自动唤醒。
1、设置Timeout参数的Object.wait()方法
2、设置Timeout参数的Object.join()方法
3、LockSupport.packNanos()方法
4、LockSupport.packUntil()方法
5、阻塞(blocked):等待获取一个排他锁
6、结束(terminated):已终止的线程状态


this逃逸:在构造函数返回之前其他线程就持有该对象的引用
常见情况:在构造函数中启动一个线程

线程安全和锁优化
java语言中各种操作共享的数据分为以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。
1、不可变:final修饰的
2、绝对线程安全:
3、相对线程安全:Vector、HashTable、Collection的synchronizedCollection()方法
4、线程兼容:对象本身不是线程安全的,但是可以通过在调用端正确的使用同步手段来保证对象在并发环境中安全的使用。
5、线程对立

线程安全的实现方法
1、互斥同步
同步:多个线程并发访问共享数据,保证共享数据在同一个时刻只能被一条线程使用
互斥:实现同步的一种手段,临界区、互斥量和信号量是主要的互斥实现方式。
2、非阻塞同步



原创粉丝点击