问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

synchronized和ReentrantLock的区别

发布网友 发布时间:2022-03-25 01:44

我来回答

1个回答

热心网友 时间:2022-03-25 03:13

ReentrantLock 的lock机制有2种,忽略中断锁和响应中断锁,这给我们带来了很大的灵活性。比如:如果A、B2个线程去竞争锁,A线程得到了锁,B线程等待,但是A线程这个时候实在有太多事情要处理,就是 一直不返回,B线程可能就会等不及了,想中断自己,不再等待这个锁了,转而处理其他事情。这个时候ReentrantLock就提供了2种机制,第一,B线程中断自己(或者别的线程中断它),但是ReentrantLock 不去响应,继续让B线程等待,你再怎么中断,我全当耳边风(synchronized原语就是如此);第二,B线程中断自己(或者别的线程中断它),ReentrantLock 处理了这个中断,并且不再等待这个锁的到来,完全放弃。请看例子:

/**
* @version 0.10 2009-11-6
* @author Zhang Hua
*/
public class Test {
//是用ReentrantLock,还是用synchronized
public static boolean useSynchronized = false;
public static void main(String[] args) {
IBuffer buff = null;
if(useSynchronized){
buff = new Buffer();
}else{
buff = new BufferInterruptibly();
}
final Writer writer = new Writer(buff);
final Reader reader = new Reader(buff);
writer.start();
reader.start();
new Thread(new Runnable() {
public void run() {
long start = System.currentTimeMillis();
for (;;) {
// 等5秒钟去中断读
if (System.currentTimeMillis() - start > 5000) {
System.out.println("不等了,尝试中断");
reader.interrupt();
break;
}

}

}
}).start();
}
}

interface IBuffer{
public void write();
public void read() throws InterruptedException;
}
class Buffer implements IBuffer{
private Object lock;

public Buffer() {
lock = this;
}

public void write() {
synchronized (lock) {
long startTime = System.currentTimeMillis();
System.out.println("开始往这个buff写入数据…");
for (;;)// 模拟要处理很长时间
{
if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)
break;
}
System.out.println("终于写完了");
}
}

public void read() {
synchronized (lock) {
System.out.println("从这个buff读数据");
}
}
}

class BufferInterruptibly implements IBuffer{

private ReentrantLock lock = new ReentrantLock();

public void write() {
lock.lock();
try {
long startTime = System.currentTimeMillis();
System.out.println("开始往这个buff写入数据…");
for (;;)// 模拟要处理很长时间
{
if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)
break;
}
System.out.println("终于写完了");
} finally {
lock.unlock();
}
}

public void read() throws InterruptedException{
lock.lockInterruptibly();// 注意这里,可以响应中断
try {
System.out.println("从这个buff读数据");
} finally {
lock.unlock();
}
}

}

class Writer extends Thread {

private IBuffer buff;

public Writer(IBuffer buff) {
this.buff = buff;
}

@Override
public void run() {
buff.write();
}

}

class Reader extends Thread {

private IBuffer buff;

public Reader(IBuffer buff) {
this.buff = buff;
}

@Override
public void run() {

try {
buff.read();
} catch (InterruptedException e) {
System.out.println("我不读了");
}

System.out.println("读结束");

}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 多线程安全实现方式,synchronized和lock,信号量的区别 ios开发synchronized和lock的区别 java中实现同步的两种方式syschronized和lock的区别和联系 java如何实现线程安全,synchronized和lock的区别,可重入锁 java同步锁中synchronized和Lock接口类的区别 深入研究 Java Synchronize 和 Lock 的区别与用法 面试synchronized和locak有什么异同 java lock和synchorinzed的区别 synchronized和lock的区别 csdn Lock和synchronized的区别和使用 请问java中的lock和synchronized区别是什么? synchronized和lock的区别? synchronized和lock的区别 华为手机怎么设置人脸识别 华为手机设置人脸识别方法 华为荣耀手机如何设置人脸解锁 华为荣耀人脸解锁教程 苹果7充电时用苹果数据线和vivo充电头能行吗?影响手机吗? 苹果不是用原装充电器,对手机有坏处吗? 苹果pd充电器充不上电插上去没反应? iphone 7能用普通的充电器吗? 苹果的设备为什么用普通充电器充电会容易坏? synchronized与lock,哪个效率更高 拼多多的二维码在哪里扫 拼多多开蓝码二维码教程 别人发过来二维码,扫码别人就可以进入自己的拼多多店铺是怎么操作的? 别人发过来二维码,自己扫二维码别人就可以进入自己的拼多多店铺是怎么操作的_问一问 拼多多天天领现金为啥没有二维码 拼多多不想帮别人扫二维码领红包怎么办 为什么拼多多大转盘没有二维码 美团商家如何添加价格与商品 美团外面商家版如何批量上传商品介绍图片 您好,我是店家,美团外卖,怎样才能把拍的小视频和产品图片一起上传上 美团外卖商家怎么能上传视频,有什么规律吗? 美团怎么上传视频招牌 如何把自家的商品或活动上架在大众点评或美团上呀?急,必釆 华为手机每天跳出行走路线是怎么回事 华为手机导航信号弱 华为手机导航总提示当前GPS信号弱是怎么回事? 华为手机gps信号弱怎么办 但是信号很好 华为 P8手机使用百度导航或是高德导航时总是显示GPS信号弱是怎么回事? 刚买的华为手机怎么用它导航运行路线?