关于lock锁
在 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锁的更多相关文章
- Lock锁的使用示例
Lock锁是java5用来代替synchronized的一种面向对象的锁的方案 public class LockDemo { /** * Lock是用来替换synchronized, 优点是Lock ...
- Android(java)学习笔记69:JDK5之后的Lock锁的概述和使用
1. Lock锁的概述: java.util.concurrent.locks,接口Lock 首先Lock是一个接口,Lock实现提供了比使用synchronized方法 和 同步代码块更为广泛的锁定 ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- Lock锁_线程_线程域
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- (删)Java线程同步实现二:Lock锁和Condition
在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...
- 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)
简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...
- 使用Lock锁生产者消费者模式
package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurren ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- java并发编程的艺术——第五章总结(Lock锁与队列同步器)
Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...
- Java中的Lock锁
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...
随机推荐
- HDU 3534 Tree (经典树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...
- BZOJ2527Meteors
BZOJ2527 整体二分模板题 整体二分: 主要用于解决第K大问题 #include<cstdio> #include<cctype> #include<vector& ...
- Android CrashHandler
package jason.android.utils; import android.content.Context; import android.content.pm.PackageInfo; ...
- iOS --SKView类
SKView类 继承自 UIView:UIResponder:NSObject 符合 NSCoding(UIView)UIAppearance(UIView)UIAppearanceContainer ...
- ubuntu 配置 django
安装 安装Apache sudo apt-get install apache2 安装Django 下载Django 安装mod_wsgi sudo apt-get install libapache ...
- 使用sqlalchemy查询并删除数据表的唯一性索引
简单描述表结构,字段类型 desc tabl_name 删除索引:alter table `db`.`table_name` drop index `index_name` 注意里面的特殊符号: ` ...
- SQL中Inserted 和Deleted表 以及触发Trigger
什么是Inserted 和Deleted表 他们有什么用 trigger 的简单实用 1.什么是Inserted 和Deleted表 当插入数据的时候,其实是同时向目的表 和inserted表中插入数 ...
- JavaWeb页面添加隐藏版权信息
JavaWeb页面添加隐藏版权信息. 首先,我推荐一个值得玩味的版权站点,有兴趣的朋友能够去看上一看.Nazo Level 1,这个demo中我能发掘到有5个步骤,你看你能发现几层? 接下来.我来介绍 ...
- css3: background-image使用多个背景图像
CSS3 允许元素使用多个背景图像. background-image: url(img/ic_ms.png),url(img/icon_dutyfree_invite.png); <!DOCT ...
- Controller//控制器
#include<opencv2\core\core.hpp> #include<opencv2\imgproc\imgproc.hpp> #include<opencv ...