千锋教育-做有情怀、有良心、有品质的IT职业教育机构

400-811-9990
当前位置:首页 > 关于学院 > 技术论坛  >  正文

Java教程之使用Lock取代synchronized

时间:2018-06-15 10:57:04     来源:千锋教育 作者:千锋老师

在多线程中,1.5版本之前,我们都使用同步代码块或者同步方法来解决线程安全问题

比如:

同步代码块

synchronized(锁对象){</p>

<pre><code>功能代码;

}

同步方法

public synchronized void test(){

功能代码;

}

在1.5版本,在java的工具类包中,java.util.concurrent.locks 中,推出了最新的

解决线程安全的方法,就是Lock+Condition的方式,

那这两种方式之间的关系和区别是什么呢?

加入对于线程常见的生产者消费者模式,我们使用两种方式实现,来看看他们的区别:

第一种,使用synchronized

我们完成一个男人挣钱女人花的例子

需求是如果没钱,男人线程挣一次钱,等待,然后唤醒女人去花钱,花完钱,等待,唤醒

男人去挣钱,一直循环这个过程,将男人线程看做生产线程,女人线程看做消费线程。

代码如下:

//首先完成共享数据

class Person{

String name;

boolean isMoney=true;

//挣钱

public void zhengQian(){

synchronized(this){

while(!isMoney){

try{wait();}catch(Exception e){}

}

name="男人";

System.out.println(Thread.currentThread().getName()+name+"---挣钱---");

isMoney=!isMoney;

notifyAll();//叫醒所有

}

}

//花钱

public void huaQian(){

synchronized(this){

while(isMoney){

try{wait();}catch(Exception e){}

}

name="women。。。。人";

System.out.println(Thread.currentThread().getName()+name+"---花=========钱---");

isMoney=!isMoney;

notifyAll();//叫醒所有

}

}

}

//输入线程

class In implements Runnable{

Person p=null;

In(Person p){

this.p=p;

}

public void run(){

while(true){

p.zhengQian();

}

}

}

//输出线程

class Out implements Runnable{

Person p=null;

Out(Person p){

this.p=p;

}

public void run(){

while(true){

p.huaQian();

}

}

}

从代码中可以看出,对于同步代码块或者同步方法来说,都是以锁对象this来控制其锁定的代码的。

api中也告诉我们:

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。

那使用Lock+Condition怎么来实现呢?

代码如下:

import java.util.concurrent.locks.*;

class Person{

String name;

boolean isMoney=true;

Lock lock=new ReentrantLock();

Condition in=lock.newCondition();

Condition out=lock.newCondition();

//挣钱

public void zhengQian(){

lock.lock();

try{

while(!isMoney){

try{in.wait();}catch(Exception e){}

}

name="男人";

System.out.println(Thread.currentThread().getName()+name+"---挣钱---");

isMoney=!isMoney;

out.signal();//叫醒对方

}finally{

lock.unlock();

}

}

//花钱

public void huaQian(){

lock.lock();

try{

while(!isMoney){

try{out.wait();}catch(Exception e){}

}

name="women。。。。人";

System.out.println(Thread.currentThread().getName()+name+"---花=========钱---");

isMoney=!isMoney;

in.signal();//叫醒对方

}finally{

lock.unlock();

}

}

}

对比发现,Lock+Condition的方式是使用Condition对象来具体操作现场的等待和唤醒的,

也就是对于生产线程有专属的生成线程的Condition对象,对消费线程有专属的消费线程的Condition

对象,当等待或者唤醒时可以精确的控制是哪方线程,同步代码块或者同步方法在唤醒时,不能精确的

唤醒对方,所以只能唤醒全部,这时候增加了线程的判断次数,明显,Lock+Condition是优于synchronized的方式的

接下来我们分析下Lock和Condition的关系

Lock的子类对象是来取代synchronized的,也就是锁,Condition只是锁的操作对象

取代的是以前的锁对象,都拥有等待和唤醒的方法,虽然名字不同,Condition主要是对锁的操作对象

进行分类,如下图:

<a href=http://www.mobiletrain.org/ target=_blank class=infotextkey>Java培训</a>.png

上图中,一个Lock对象,创建出来三个Condition对象 x,y,z

也就是以后执行这个锁的线程将会被分成三类线程,比如如果执行x.await(),执行这段代码的

三个绿色线程将会进入等待状态,再比如z中三个红色线程都处于等待状态,如果执行z.signal(),将会唤醒执行z的三个红色线程中的某一个,这样代码就可以正常运行了。

蓝色线两侧分别表示两个Lock的子类对象,每一个lock的Condition之间可以互相操作,对于两个

锁之间的Condition,比如,x和Q,就没有直接的关系了

好了,这篇文章主要说明下Lock+Condition方式来取代synchronized,希望对大家有所帮助。

千锋Java培训作为中国IT研发人才一体化服务的开拓者,为学生制定合理有序的学习计划,0学费入学,2周免费试听不满意不收费,与学员签订就业协议,坚持良心面授,从千锋Java培训班出去的学员均已高薪就业。千锋推出的免费java视频教程,让学员能够方面的巩固基础技术能力。

相关文章

  • 北京天丰利校区(总部)地址:北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼2、3层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训、好程序员
  • 深圳西部硅谷校区地址:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619
    深圳大学城校区地址:深圳市南山区留仙大道1201号大学城创客小镇16栋3楼
    咨询电话: 0755-23015275/23015546-801(硅谷) 0755-86660670-801(大学城)
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训、好程序员
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990 021-65233829-609
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训、好程序员
  • 郑州校区地址:郑州市二七区航海中路60号海为科技园C区10层、12层
    咨询电话:0371-55191750
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 广州校区地址:广州市天河区元岗路310号智汇park创意园E座5层
    咨询电话:020-22119207
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 武汉金融港校区地址:武汉市东湖高新技术开发区光谷大道77号金融港B18栋3楼
    武汉智慧园校区地址:武汉市东湖高新技术开发区光谷大道61号智慧园21栋2楼
    咨询电话:027-59313371
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
    咨询电话:400-811-9990 028-83178771
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85363390
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 杭州校区地址:浙江省杭州市江干区九堡旺田书画城A座4层
    咨询电话:400-811-9990 0571-86893632
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 青岛校区地址:青岛市市北区龙城路卓越世纪中心3号楼8层801
    咨询电话:0532-80911190
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 重庆校区地址:重庆市高新区科园一路2号大西洋国际12-1
    咨询电话:400-811-9990 023-68883009
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:0731-85513210
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 哈尔滨校区地址:哈尔滨市松北区创新一路699号 科技创新城19号楼B座五楼
    咨询电话:400-811-9990/0451-87173191
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 南京校区地址:南京市建邺区应天大街780号应天智汇产业园弘辉园1幢2楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训、Android培训、iOS培训
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱