Java高并发程序设计(二)--JMM和volatile和synchronized

首先介绍JMM(Java内存模型):JMM是一种保证多线程之间有效的正确的协同工作的机制。

JMM有三个关键技术:原子性,可见性,有序性

(1)原子性:原子性是指一个操作是不可中断的,即一个操作开始,就不会被打扰。

(2)可见性:可见性是指当一个线程修改了共享变量的值,其他线程能不能知道。在一个操作中修改了变量,在后续操作中操作的值一定是修改之后的。

(3)有序性:程序在执行时,指令可能重排,重排后的指令与原指令顺序不一定一致。

 

Java使用了一些特殊的操作或者特殊的关键字,来告诉虚拟机,哪些地方不能随意变动,哪些地方要格外小心。

volatile就是这样一个关键字,它会告诉虚拟机,这个地方会经常修改,所以要格外小心。

它能保证程序的有序性和可见性,但是不能保证复合操作的原子性,比如给一个int变量i加上它,当i+=1的时候,它并不能保证该操作的原子性。因为中间经历了取值,操作,赋值三个步骤。

 

再说synchronize,它是用来线程同步的,能保证原子性,可见性,有序性,被它修饰的代码块,一次只有一个线程能够进去。

synchronize有三种用法:

(1)给指定对象加锁:对给定对象加锁,在操作前必须获得对象的锁

(2)直接作用于实例方法:相当于给当前实例加锁,在操作前要获得实例的锁(Vector,Hashtable)

(3)直接作用于静态方法:相当于对当前类加锁,操作前要获得类的锁

要注意对象,类,实例的区别。

 

posted @ 2018-07-27 15:25  蒋曾  阅读(247)  评论(0编辑  收藏  举报