您的位置:首页 > 编程语言 > Java开发

java 多线程基础知识2---同步机制

2014-04-27 20:00 302 查看

1.线程安全类

当一个类是无状态的类时,这个类就是线程安全的,因为该类没有共享的可变状态。
当一个类是有一个共享的可变状态时,可以使用Atomic包中的类来保证线程安全。
当一个类有多个共享的可变状态时,那么为了保证线程安全,必须采用一定的同步机制来确保
对可变状态访问的原子性和可见性。

2.同步机制

2.1.synchronized代码块和synchronized方法
如果将synchronized修饰方法,那么这个方法就具有同步机制。例如:
public synchronized static void xxxMethod(){}

如果在方法内部,synchronized可以形成同步代码块,例如:
synchronized(this){
// do something
}

synchronized 方法一般情况下会影响并发性能,所以在使用synchronized时,尽量将synchronized的范围缩小,
同时避免synchronized块中包含 不必要的非同步代码,或者计算耗时长,或者I/O操作耗时长的代码。总之一句话:
尽量缩小synchronized的代码范围,减少synchronized块的执行时间,提高并发性

2.2 volatile变量
当把变量声明为volatile类型后,在编译器和运行时都会注意到这个变量是共享的,因此就不会将该变量上的操作与其他内存操作一起重排序。
不要过度依赖volatile,仅当volatile变量能简化代码实现,以及对同步策略的验证时,才应该使用它。
volatile通常用作某个操作完成,中断,或者状态的标识。
当且仅当满足一下所有条件时,才能使用volatile:
1.对变量的写入操作不依赖当前变量值,或者你能确保只有单个线程更新变量的值。
2.该变量不会与其他变量一起纳入到不变性条件中。
3.在访问变量时不需要加锁。

总结:synchronized 不仅实现了操作的原子性,而且实现了内存可见性。而volatile只是实现了内存可见性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: