Synchronized和java.util.concurrent.locks.Lockde区别联系
1、Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用的时候JVM可以自动释放,但是Lock需要程序员在finally块中手动释放。
synchronize在同步资源上,首先线程A获得了该资源的锁,并开始执行,此时他想要操作此资源的程序就必须等待,如果线程A由于某种原因处理常时间的操作状态,那么其他线程就无法得到处理他么的任务,只能无限的等待。所以Lock机制很好的解决了这个问题。
condition(条件队列或者条件变量) 替代了Object监察方法的使用,condition中的方法如下:
- // 造成当前线程在接到信号或被中断之前一直处于等待状态。
- void await()
- // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
- boolean await(long time, TimeUnit unit)
- // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
- long awaitNanos(long nanosTimeout)
- // 造成当前线程在接到信号之前一直处于等待状态。
- void awaitUninterruptibly()
- // 造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。
- boolean awaitUntil(Date deadline)
- // 唤醒一个等待线程。
- void signal()
- // 唤醒所有等待线程。
- void signalAll()
lock接口的方法:
- // 获取锁
- void lock()
- // 如果当前线程未被中断,则获取锁
- void lockInterruptibly()
- // 返回绑定到此 Lock 实例的新 Condition 实例
- Condition newCondition()
- // 仅在调用时锁为空闲状态才获取该锁
- boolean tryLock()
- // 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁
- boolean tryLock(long time, TimeUnit unit)
- // 释放锁
- void unlock()
package co.DuXieZhe;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BoundedBuffer {
final Lock lock = new ReentrantLock();// 锁对象
final Condition notFull = lock.newCondition();// 写线程条件
final Condition notEmpty = lock.newCondition();// 读线程条件
final Integer[] items = new Integer[10];// 缓存队列
int putptr/* 写索引 */, takeptr/* 读索引 */, count/* 队列中存在的数据个数 */;
public void put(Integer x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
// 如果队列满了
notFull.await();// 阻塞写线程
items[putptr] = x;// 赋值
System.out.println("写入:" + x);
if (++putptr == items.length)
putptr = 0;// 如果写索引写到队列的最后一个位置了,那么置为0
++count;// 个数++
notEmpty.signal();// 唤醒读线程
} finally {
lock.unlock();
}
}
public Integer take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
// 如果队列为空
notEmpty.await();// 阻塞读线程
Integer x = items[takeptr];// 取值
System.out.println("读取:" + x);
if (++takeptr == items.length)
takeptr = 0;// 如果读索引读到队列的最后一个位置了,那么置为0
--count;// 个数--
notFull.signal();// 唤醒写线程
return x;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
final BoundedBuffer b = new BoundedBuffer();
new Thread(new Runnable() {
public void run() {
int i = 0;
while (true) {
try {
b.put(i++);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
public void run() {
while (true) {
try {
b.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
Synchronized和java.util.concurrent.locks.Lockde区别联系的更多相关文章
- synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...
- 简述synchronized和java.util.concurrent.locks.Lock异同
主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...
- 对比synchronized与java.util.concurrent.locks.Lock 的异同
主要区别 1.Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如公平锁.等待可中断.锁绑定多个条件等: 2.synchronized 是Java 语言层面的,是内置的关 ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同
1.synchronized 用在方法和代码块的区别? a. 可以只对需要同步的使用 b.与wait(),notify()和notifyall()方法使用比较方便 2.wait() a.释放持有的对象 ...
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...
- (面试题)synchronized 和 java.util.concurrent.locks.Lock 的异同
主要相同点: Lock 能完成 synchronized 所实现的所有功能: 主要不同点: Lock 有比 synchronized 更精确的线程语义和更好的性能. synchronized 会自动释 ...
- 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...
随机推荐
- 算法-链的操作(一)-合并两个排序的链接(no.25)
合并两个排序的链接(no.25) 把下面连个排好序的链,从小到大排序链接. list1 : 1 -> 6 -> 8 list2 : 2-> 5 -> 9 def merge(h ...
- nodejs -Promise
创建一个 readFile.js,读取三个文件abc的内容并输出到控制台 var fs = require('fs') fs.readFile('./a.txt','utf-8',function ( ...
- Python学习-环境搭建(IronPython)
一.IDE环境 VS2013 下安装 PTVS 2.2.2 VS 2013 VS2015 已经集成了Python的开发环境 二.安装 IronPython 下载地址:http://ironpytho ...
- JavaWeb - Servlet教程
http://www.runoob.com/servlet/servlet-tutorial.html
- HDOJ 1166 敌兵布阵 (线段树)
题目: Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Ti ...
- 【leetcode】657. Robot Return to Origin
Algorithm [leetcode]657. Robot Return to Origin https://leetcode.com/problems/robot-return-to-origin ...
- Python3 GIL(Global Interpreter Lock)与多线程
GIL(Global Interpreter Lock)与多线程 GIL介绍 GIL与Lock GIL与多线程 多线程性能测试 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线 ...
- BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- JUnit3 和 JUnit4的区别
JUnit3 和 JUnit4的区别 1.JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.Framework.*;为了向后兼容,JUnit4发行版中加入了这两种包. ...
- Alpha 冲刺 (6/10)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:感恩节~ 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 设计了拍照界面和图片上传界面 沟通了前端进度 接下 ...