A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
我们已经知道解决线程同步有两种方法:第一种使用同步方法即使用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 的一部分。
*/

1 个回复

倒序浏览
Lock能完成synchronized所实现的所有功能
Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马