黑马程序员技术交流社区
标题: 解决线程同步的第三种方法,使用特殊成员变量 [打印本页]
作者: 张頔 时间: 2012-7-24 20:45
标题: 解决线程同步的第三种方法,使用特殊成员变量
/*
我们已经知道解决线程同步有两种方法:第一种使用同步方法即使用synchronized关键字修饰方法,虽然同步方法
很简单但是同步的开销是很大的,因此应该尽量减少同步的代码于是就有了第二种,使用synchronized(mutex){}
将方法中同步代码包起来。两种方法毕老师都有讲
除此之外还有第三种方法,使用特殊成员变量volatile
如果仅仅因为一两个成员变量的修饰而使用同步,开销还是很大。此时可以使用volatile关键字来修饰成员变量。
它的作用在于告诉虚拟机该成员变量可能已经被修改了,需要进行确认才能使用,这样就避免了同步的需求
*/
public class People implements Runnable{
private volatile int number = 0;//用volatile来修饰成员变量
public void run() {
for(int i=0;i<5;i++){
try{Thread.sleep(100);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+": "+number++);
}
}
public static void main(String args[]){
People demo = new People();
Thread t1 = new Thread(demo);
Thread t2 = new Thread(demo);
t1.start();
t2.start();
}
}
/*需要说明的是Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错,
这段代码,也不太安全,有时也会出错,但是使用 volatile 变量的主要原因是其简易性:在某些情形下,
使用 volatile 变量要比使用相应的锁简单得多。使用 volatile 变量次要原因是其性能:某些情况下,volatile
变量同步机制的性能要优于锁。
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,
volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。
*/
作者: 王志明 时间: 2012-7-25 00:37
Lock能完成synchronized所实现的所有功能
Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |