在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. 2018SDIBT_国庆个人第四场

    A - A  这题很巧妙啊,前两天刚好做过,而且就在博客里  Little C Loves 3 I time limit per test 1 second memory limit per test ...

  2. Eclipse优化常用方法

    Eclipse优化常用方法如下: 1.减少不必要的验证 将Manual保持不动,build里面只留下classpath dependency Validator,其他的全部去掉.如果以后需要对文件进行 ...

  3. Ftp命令使用

    FTP> ? 显示 ftp 命令说明.? 与 help 相同. 格式:?  [command] 说明:[command] 指定需要帮助的命令名称.如果没有指定 command,ftp将显示全部命 ...

  4. 多线程 Runnable 实现线程 内部类

    public class ThreadDemo4 { public static void main(String[] args){ System.out.println(Thread.current ...

  5. 吴裕雄 25-MySQL 临时表

    MySQL 临时表MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间.临时表在MySQL 3.23版本中添加,如果你 ...

  6. Java 中 == 和 equals 的区别

    有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...

  7. 最小生成树一·Prim算法

    描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...

  8. /WebRoot/WEB-INF/web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  9. 云主机上配置lamp环境 php5.6+apache2.2.15+mysql5.1.73

    安装 PHP5.6 rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm; rp ...

  10. 签名Cookie

    [签名Cookie] set-cookie时加上防篡改验证码. 如: user_name=alex|bj95ef23cc6daecc475de   防篡改验证码的生成规则可以很简单:md5(cooki ...