在jdk 1.5 后,Java 引入了lock 锁来替代synchronized ,在使用中,lock锁的使用更加灵活,提供了灵活的 api ,不像传统的synchronized ,一旦进入synchronized中,方法是无法打断的,也就是说有时候会陷入漫长的等待当中;以及进行公平锁的创建(synchronized 说非公平的锁);

一,使用规范:

lock.lock();
try {
//doSomeThing
}
finally {
lock.unlock();
} 就相当于: synchronized mehod () { }

二,创建锁对象

ReentrantLock lock =new ReentrantLock();等价于 ReentrantLock lock =new ReentrantLock(false); 创建非公平锁

ReentrantLock lock =new ReentrantLock(true); 创建公平锁

三,公平锁与非公平锁的区别(以公平锁和非公平锁两种方式以多线程方式运行)

class ReenLock implements Runnable{
//创建公平锁
ReentrantLock lock =new ReentrantLock(true);
//创建非公平锁
//ReentrantLock lock =new ReentrantLock();
@Override
public void run() {
while(true) {
try {
lock.lock();
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"拿到了锁");
}
catch(Exception e) {
e.getStackTrace();
}
finally {
lock.unlock();
}
}
}
}

公平锁运行结果:

Thread-0拿到了锁
Thread-1拿到了锁
Thread-0拿到了锁
Thread-1拿到了锁
Thread-0拿到了锁

非公平锁运行结果:

Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁

结论:

1.公平锁保证了线程的运行顺序,按照先进线程的原则,每一次执行都要进行判断
2.非公平锁执行是无序的,但效率是最高了,synchronized 也是非公平锁,也是推荐使用的

四,tryLock() 使用;

trylock() :尝试去获得锁,返回boolean, ≈在指定的时间内,如果它没有被其他线程占有且没有被打断,则获得这把锁;

我们可以在没有获得这把锁的时候,去执行程序其他的逻辑;

class TryLock implements Runnable{

    //创建非公平锁
ReentrantLock lock =new ReentrantLock();
@Override
public void run() { boolean tryLock =false; try {
//尝试获取锁,如果能得到锁,则立即返回true
tryLock=lock.tryLock(5, TimeUnit.SECONDS);
if(tryLock) {
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName()+"拿到了锁");
}
else {
                //没有拿到锁
System.out.println("号外:有个人长时间占这锁");
}
}
catch(Exception e) {
e.getStackTrace();
}
finally {
        //必须进行判断,以防拿不到锁去释放会报错
if(tryLock) {lock.unlock();};
} }
}

五, 要说lock 锁代替了synchronized ,那么condition 代替了object 中 wait notify notifyAll 等方法;

演示使用lock 和condition 进行生产者与消费者的演示

/**
* use jdk1.5 的reentranLock 与condition 进行provider and consumer
* lock 锁代替了synchronized
* @author iscys
*
*/
public class LockAndConditionProviderAndConsumer { public static void main(String[] args) { NewLock samp =new NewLock();
PrividerNewHandler provider =new PrividerNewHandler(samp);
ConsumerNewHandler consumer =new ConsumerNewHandler(samp); new Thread(provider).start();
new Thread(provider).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
} } class PrividerNewHandler implements Runnable{
private NewLock newl;
PrividerNewHandler(NewLock newl){
this.newl=newl;
}
@Override
public void run() { try {
while(true)
newl.provider();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class ConsumerNewHandler implements Runnable{
private NewLock newl;
ConsumerNewHandler(NewLock newl){
this.newl=newl;
}
@Override
public void run() { try {
while(true)
newl.consumer();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class NewLock{
private int max =10;
private int init=0;
ReentrantLock lock =new ReentrantLock();
Condition p =lock.newCondition();
Condition c=lock.newCondition();
void provider(){
lock.lock();
try {
while(init>=max) {
p.await();
}
Thread.sleep(100);
init++;
System.out.println(Thread.currentThread().getName()+"生产到了"+init);
c.signalAll();
}
catch(Exception e) {}
finally {lock.unlock();} } void consumer(){
lock.lock();
try {
while(init==0) {
c.await();
}
Thread.sleep(100);
init--; System.err.println(Thread.currentThread().getName()+"消费到了"+init);
p.signalAll();
}
catch(Exception e) {}
finally {lock.unlock();} }
}

java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式的更多相关文章

  1. java 线程Thread 技术--线程状态与同步问题

    线程技术第三篇: 线程的状态: 1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源 2.可运行状态:当线程调用start 方法将为线程分配必须的系统资 ...

  2. java 线程Thread 技术--volatile关键字

    java 语言中允许线程访问共享变量,为了保证共享变量能被准确和一致的更新,Java 语言提供了volatile 关键字,也就是我们所说的内存一致性: 问题抛出:(尝试去运行下面代码,以及将volat ...

  3. java 线程Thread 技术--1.5 Future与Callable

    Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...

  4. java 线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue

    Executors : Executors ,就是一个线程工具类:大部分操作线程的方法,都可以在这个工具类中就行创建,执行,调用一些线程的方法: Executor : 用于执行和提交一个runnabl ...

  5. java 线程Thread 技术--方法演示生产与消费模式

    利用wait 与notifyAll 方法进行演示生产与消费的模式的演示,我们两个线程负责生产,两个线程消费,只有生产了才能消费: 在effective Java 中有说过: 1. 在Java 中 ,使 ...

  6. java 线程Thread 技术--线程创建源码解释

    永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...

  7. java 线程Thread 技术--线程方法详解

    Thread 类常用的方法与Object类提供的线程操作方法:(一个对象只有一把锁

  8. java 线程Thread 技术--创建线程的方式

    在第一节中,对线程的创建我们通过看文档,得知线程的创建有两种方式进行实现,我们进行第一种方式的创建,通过继承Thread 类 ,并且重写它的run 方法,就可以进行线程的创建,所有的程序执行都放在了r ...

  9. java线程池技术(二): 核心ThreadPoolExecutor介绍

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...

随机推荐

  1. jinjia

    https://www.cnblogs.com/dachenzi/p/8242713.html

  2. iOS 内存管理,ARC

    iOS 对象内存释放时机:当对象的引用计数为0时对象被释放. 所以如下代码: __weak NSObject * a = [[NSObject alloc] init]; 这个对象在创建完赋完值后会被 ...

  3. 开发webapp手机返回键 退出问题 摘录

    mui进行手机物理键的监听 确保引入mui 调用以下函数 // android 返回按键处理 androidBack(store, data) { try { mui.init({ keyEventB ...

  4. echarts-颜色渐变

    图形的颜色. 默认从全局调色盘 option.color 获取颜色 颜色可以使用 RGB 表示,比如 'rgb(128, 128, 128)',如果想要加上 alpha 通道表示不透明度,可以使用 R ...

  5. sublime text3:快捷键

    1.就近选择相同项:ctrl+d,按住ctrl,然后多次按d,就不断往下选择相同项 2.选择所有匹配项:alt+f3,一次性选中所有匹配项 3.ctrl+shift+a:在html中同时按这三个键,则 ...

  6. 尚硅谷redis学习8-事务

    是什么? 能干嘛? 常用命令 案例说明 1.正常执行 2.放弃事务 3.全部放弃(全体连坐) 4.只抛弃错误(冤头债主) 5.watch监控 悲观锁 悲观锁(Pessimistic Lock), 顾名 ...

  7. VULKAN学习资料收集

    https://github.com/vinjn/awesome-vulkan 张静初 https://zhuanlan.zhihu.com/p/24798656 知乎 https://develop ...

  8. 一个docker镜像中的目录删除不了问题

    在一个容器中,删除一个目录,失败: bash-4.2# pwd /home/zxcdn/ottcache/tomcat bash-4.2# uname -a Linux 3516b6c97679 -. ...

  9. Shell条件表达式

    Shell编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断比较方法. 文件状态判断 文件状态的判断通常使 ...

  10. adb INSTALL_FAILED_UPDATE_INCOMPATIBLE

    今天用Eclipse运行项目时出错: LOG: [2018-05-09 14:16:19 - Module_Android_Demo] ------------------------------ [ ...