java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
看API文档介绍几个方法:
JDK1.5中提供了多线程的升级解决方案:
特点: 1.将同步synchronized显示的替换成Lock
2.接口Condition:Condition替代了Object监视器方法(wait、notify、notifyAll),分别替换成了await(),signal() (唤醒一个等待线 程),signalAll() 唤醒多个线程。一个锁可以绑定多个condition对象,可以对应好几组wait,notify,notifyAll动作。
java.util.concurrent.locks接口:
* Lock接口下面的方法
* void lock():获取锁,如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。
* boolean tryLock():如果获得了锁,返回true。如果别的线程正在持有锁,返回false
* boolean tryLock(long time,//等待多长时间获得锁
TimeUnit unit)
throws InterruptedException:
如果获取到锁,立即返回true,如果别的线程正在持有锁,会等待参数给定的时间,如果在这段时间内获得了锁就返回true,如果等待超时,返 回false。
locks的实现类:
java.lang.Object
-->java.util.concurrent.locks.ReentrantLock类一个可重入的互斥锁 Lock,替代synchronized,比synchronized有更强大的功能
-->Java.util.concurrent.locks.ReadWriteLock 提供了一对可供读写并发的锁。
使用新的锁完成生产者消费者模型:
代码如下:
仓库类(资源)
class ResourceNew{
private String name;
private boolean flag = false;
private int count=1;
private final Lock lock = new ReentrantLock();//将同步synchronized显示的替换成Lock
private Condition condition_cusumer = lock.newCondition();//同一个锁上可以绑定多个相关的Condition
private Condition conditon_producer = lock.newCondition();
public void set(String name) throws InterruptedException{
try{
lock.lock();//显示的
while(flag){
conditon_producer.await();//生产者等待t1,t2
}
this.name = name+"---"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
this.flag = true;
//condition.signalAll();//唤醒本方和唤醒对方
condition_cusumer.signal();//唤醒某个消费者
}finally{
lock.unlock();//每个线程进入锁必须要执行的操作,最终要释放锁
}
}
public void out() throws InterruptedException{
try{
lock.lock();
while(!flag){
condition_cusumer.await();//消费者等待
}
System.out.println(Thread.currentThread().getName()+".消费者."+this.name);
this.flag = false;
conditon_producer.signalAll();//唤醒生产者
}finally{
lock.unlock();
}
}
}
生产者:
/**
*
* @author Administrator
* 生产者负责生产,操作同一个资源,但是是生产动作
*
*/
class producerNew implements Runnable{
private ResourceNew res;
public producerNew(ResourceNew res){
this.res = res;
}
public void run() {
while(true){
try {
res.set("..商品..");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
*
* @author Administrator
* 消费者负责消费生产者提供的产品,操作的同一个资源,但是是消费动作
*
*/
class CusumerNew implements Runnable{
private ResourceNew res;
public CusumerNew(ResourceNew res){
this.res = res;
}
public void run() {
while(true){
try {
res.out();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消费者:
/**
*
* @author Administrator
* 消费者负责消费生产者提供的产品,操作的同一个资源,但是是消费动作
*
*/
class CusumerNew implements Runnable{
private ResourceNew res;
public CusumerNew(ResourceNew res){
this.res = res;
}
public void run() {
while(true){
try {
res.out();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
synchronized和java.util.concurrent.locks.Lock的异同 :
* 相同点:Lock能完成synchronized所实现的所有功能。
* 不同点:1.Lock比Synchonized更精确的线程锁语义和更好的性能。(Synchonized是独占锁,性能不高,而Lock是借助于JNI,性能更高)
* 2.Lock必须手动释放锁,在finally里面调用unlock()方法释放锁,而synchronized会自动释放锁。
java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解的更多相关文章
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- Java基础知识回顾(一):字符串小结
Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...
- java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:
总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但 ...
- java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁
1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...
- java基础知识回顾之java Thread类--java线程实现常见的两种方式实现Runnable接口(二)
创建线程的第二中方式: /** * 步骤: 1定义类实现Runnable接口 2.实现Runnable接口中的run方法. 3.通过Thread类建立线程对象,并将Run ...
- java基础知识回顾之javaIO类---FileWriter和FileReader
FileWriter类的构造方法定义如下: 1.public FileWriter(File file)throws IOException 字符流的操作比字节流操作好在一点,就是可以直接输出字符串了 ...
- java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter
FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFi ...
随机推荐
- java.lang.ThreadLocal源码分析
ThreadLocal类提供线程本地变量,为变量在每个线程创建一个副本,每个线程可以访问自己内部的副本变量. 比如,有这样一个需求,需要为每个线程创建一个独一无二的标识,这个标识在第一次调用Threa ...
- daily news新闻阅读客户端应用源码(兼容iPhone和iPad)
daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...
- Android开发之计算器(一)界面设计
计算器开发主要涉及到LinearLayout布局.EditText.Button的使用.为android入门基础内容. 打开android studio选择创建一个新的工程,应用程序的名称为Calcu ...
- Oracle中排序列中值相同引发的问题(译)
This queston came up on the Oracle newsgroup a few days ago: 这个问题在Oracle的新闻中心被提出了一段时间: I have a tabl ...
- mongodb 3.x WiredTiger存储优化测试
http://pan.baidu.com/s/1sk8zekX 总结:1.使用WiredTiger引擎压缩比例约是MMAP引擎的12倍,2.从时间上看,此次测试100个线程并发,mongodb 3.2 ...
- 如何去掉html中的超链接
$a= preg_replace("/<a[^>]+>/", "", $a); $a= preg_replace("/<\/a ...
- Laravel 5 基础(二)- 路由、控制器和视图简介
查看 app/Http/routes.php Route::get('/', 'WelcomeController@index'); @是一个界定符,前面是控制器,后面是动作,表示当用户请求url / ...
- Hibernate之HQL总结
hibernate运行过程: Hibernate作用 1.hibernate是java应用和关系数据库之间的桥梁,她负责java对象和关系数据库之间的映射. 2.hibernate内部封装了通过JDB ...
- Oracle 表的访问方式(2)-----索引扫描
索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引 ...
- 如何计算IP地址及CIDR(收藏)
如何计算IP地址及CIDR 一. IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机.网络ID用来标识计算机所处的网段:主 机ID用来标 ...