码迷,mamicode.com
首页 > 编程语言 > 详细

java——同步机制(synchronized, volatile)

时间:2017-08-30 11:08:05      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:png   对象   color   客户端   另一个   成员变量   mem   一个   获取   

1. java的线程间通信是由java的内存模型(JMM)来控制的。

JMM(java memory management) 定义了线程和主内存之间的抽象关系,一个是主内存(多线程之间来进行共享),一个是每个线程自己的私有内存

技术分享

 

2. 为什么需要同步机制?

(1) 同步机制一般发生在多线程中,当需要跨线程维护程序的正确性,当需要多个线程之间共享非final变量时,就必须使用同步机制来保证一个线程的操作对于另一个线程是可见的

(2) 同步机制保证了多个线程之间的可靠通信,保证了多个线程之间对共享变量的互斥访问,同步常用的关键字是synchronized和volatile

 

3. 同步和异步

同步:同步数据时,服务器不能干其他的事。例如客户端提起一个同步请求后,服务器在同步数据期间不能执行其他的操作

异步:客户端提起一个异步请求后,服务器在异步同步数据时依然可以执行其他操作

而java中的同步通常指同步共享数据,或者某个对象或者同步某个方法

 

4. volatile关键字

(1) 成员变量加上volatile后,线程每次访问成员变量时,都需要首先从共享内存中获取该对象,如果成员变量发生变化,还必须写回内存

(2) 也就是说volatile保证了成员变量的读写互斥,相当于一个读写锁

主意:volatile并不能保证多线程操作的原子性,只能保持每次从内存拿到的数据是当前最新的

例如:线程A,线程B同时从内存拿到一个    public volatile static int count=5    的成员变量,A,B同时操作count = count+1后,A将count=6写进去,B将count=6写进去,最后内存变量中只会是count=6。

也就是说volatile只是在线程和内存之间加了一个锁,比较线程执行前后成员变量是否改变,而不会控制线程之间的互斥操作。

 

5. synchronized关键字:保证同一时刻只有一个线程在执行synchronized修饰的内容

(1) synchronized 方法

public synchronized void test(){

    //method data

}

(2) synchronized 块

public void test(){
    synchronized(obj){
          //代码块,每次只有一个线程可以访问
    }
}

 

虽然一般同步都会介绍synchronized和volatile,但个人感觉volatile有些鸡肋,能用volatile的可以用synchronized代替。而且volatile很容易误导大家想成原子性的

 

java——同步机制(synchronized, volatile)

标签:png   对象   color   客户端   另一个   成员变量   mem   一个   获取   

原文地址:http://www.cnblogs.com/dong-liu/p/7451817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!