在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。

lock锁 也叫显示锁

大家看下这个lock锁:

lock是个接口

这个接口下面很多锁:

对于lock锁的使用,实现生产者消费者模式的:

package com.toov5.thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; //共享对象
class ResLock {
public boolean flag = true;
public String sex;
public String name;
public Lock lock = new ReentrantLock();
}
class inputThreadLock extends Thread {
public ResLock res; public inputThreadLock(ResLock res) {
this.res = res;
}
@Override
public void run() {
int count = 0;
while (true) {
try {
res.lock.lock();
if (count == 0) {
res.name = "lucy";
res.sex = "girl";
} else {
res.name = "Jack";
res.sex = "boy";
}
count = (count + 1) % 2;
} catch (Exception e) {
}finally{
res.lock.unlock(); //释放锁写在finally里面
} }
}
}
class readThreadLock extends Thread {
public ResLock res; public readThreadLock(ResLock res) {
this.res = res;
}
@Override
public void run() {
while (true) {
try {
res.lock.lock();
System.out.println(res.name + "," + res.sex); } catch (Exception e) {
e.printStackTrace();
}finally {
res.lock.unlock();
} }
}
}
public class LockTest {
public static void main(String[] args) {
Res res = new Res();
inputThread inputThread = new inputThread(res);
readThread readThread = new readThread(res);
inputThread.start();
readThread.start();
}
}

注意 unlock写到finally里面哦

然后lock锁里面的 类似于 notify 和 wait的  Condition

 Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能。

使用方法:

package com.toov5.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; //共享对象
class ResLock {
public boolean flag = true;
public String sex;
public String name;
public Lock lock = new ReentrantLock();
public Condition condition = lock.newCondition();
}
class inputThreadLock extends Thread {
public ResLock res; public inputThreadLock(ResLock res) {
this.res = res;
}
@Override
public void run() {
if (res.flag) {
try {
res.condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int count = 0;
while (true) { try {
res.lock.lock();
if (count == 0) {
res.name = "lucy";
res.sex = "girl";
} else {
res.name = "Jack";
res.sex = "boy";
}
count = (count + 1) % 2;
res.flag=true;
res.condition.signal();
} catch (Exception e) {
}finally{
res.lock.unlock(); //释放锁写在finally里面
} }
}
}
class readThreadLock extends Thread {
public ResLock res; public readThreadLock(ResLock res) {
this.res = res;
}
@Override
public void run() {
while (true) {
try {
res.lock.lock();
if (res.flag) {
res.condition.await();
}
System.out.println(res.name + "," + res.sex);
res.condition.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
res.lock.unlock();
} }
}
}
public class LockTest {
public static void main(String[] args) {
Res res = new Res();
inputThread inputThread = new inputThread(res);
readThread readThread = new readThread(res);
inputThread.start();
readThread.start();
}
}

执行结果:

Lock与synchronized 关键字的区别

Lock 接口可以尝试非阻塞地获取锁 当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。
Lock 接口能被中断地获取锁 与 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。

Lock 接口在指定的截止时间之前获取锁,如果截止时间到了依旧无法获取锁,则返回。

synchronize重量级锁  不可控制 释放锁  遇到异常 或者代码执行完毕后 释放锁

lock轻量级  可控释放锁 更灵活一些  lock是1.5出来的 比synchronize晚 弥补了一些不足 还有读写锁 重入锁 功能要强大一些

关于lock锁的更多相关文章

  1. Lock锁的使用示例

    Lock锁是java5用来代替synchronized的一种面向对象的锁的方案 public class LockDemo { /** * Lock是用来替换synchronized, 优点是Lock ...

  2. Android(java)学习笔记69:JDK5之后的Lock锁的概述和使用

    1. Lock锁的概述: java.util.concurrent.locks,接口Lock 首先Lock是一个接口,Lock实现提供了比使用synchronized方法 和 同步代码块更为广泛的锁定 ...

  3. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  4. Lock锁_线程_线程域

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  5. (删)Java线程同步实现二:Lock锁和Condition

    在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...

  6. 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)

    简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...

  7. 使用Lock锁生产者消费者模式

    package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurren ...

  8. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  9. java并发编程的艺术——第五章总结(Lock锁与队列同步器)

    Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...

  10. Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

随机推荐

  1. Java集合——概述

    Java集合——概述 摘要:本文主要介绍了几种集合类型以及有关的一些知识点. 集合类图 类图 类图说明 所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collecti ...

  2. Could not change executable permissions on the application

    I could solve it erasing an application that I had previously uploaded using the same Bundle Identif ...

  3. Android 动态生成对话框和EditText

    /** * (获取输入) */ private void showInputDialog() { ScrollView scrollview = getInitView() ; final Linea ...

  4. 【CSS】获取元素的z-index值以及各种值的意义

    js可以获取其元素的z-index值: $("document").ready(function(){ var a = $('.row').css('z-index'); aler ...

  5. serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID

    转载:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVer ...

  6. AQS实现公平锁和非公平锁

    https://www.cnblogs.com/chengdabelief/p/7493200.html AQS(AbstractQueuedSynchronizer类)是一个用来构建锁和同步器的框架 ...

  7. Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.

    运行/usr/local/webserver/php/bin/phpize时出现: Configuring for: PHP Api Version: 20041225 Zend Module Api ...

  8. Python使用Mysql过程中一些错误

    Python使用Mysql过程中一些错误 ssh登录远程服务器 ssh ubuntu@xxx.xxx.xx.xx 第一:ubuntu终端中登录Mysql mysql -uroot -p 然后输入密码即 ...

  9. MVC入门——编辑页

    添加Action  EditUserInfo using System; using System.Collections.Generic; using System.Linq; using Syst ...

  10. android:PopupWindow的使用场景和注意事项

    1.PopupWindow的特点 借用Google官方的说法: "A popup window that can be used to display an arbitrary view. ...