Sleep 和 Wait 关于锁释放的区别
sleep和wait的区别是一个老生常谈的问题。Sleep 是 Thread类的方法, wait是Object类的方法。但是关键的区别是对锁的操作问题。
当我们调用sleep的时候,线程进入休眠,但是获得的锁并不释放
而是用wait的时候,线程进入等待队列,会释放获得的锁
看一段代码:
public class TestWait {
public static void main(String[] args) throws InterruptedException {
Data d = new Data();
WaitTest st1 = new WaitTest(d);
WaitTest2 st2 = new WaitTest2(d);
st1.start();
Thread.sleep(1000);
st2.start();
}
static class WaitTest extends Thread {
Data d;
public WaitTest(Data d) {
super("thread1");
this.d = d;
}
@Override
public void run() {
try {
System.out.println("wait1Test ..." + d.getData());
} catch (InterruptedException ex) {
}
}
}
static class Data {
private String sd = "data";
private synchronized String getData() throws InterruptedException {
while (Thread.currentThread().getName().equals("thread1")) {
wait();
}
return sd;
}
}
static class WaitTest2 extends Thread {
private Lock s;
Data d;
public WaitTest2(Data d) {
this.d = d;
}
@Override
public void run() {
try {
System.out.println("waitTest2 ..." + d.getData());
} catch (InterruptedException ex) {
}
}
}
}
线程一和线程二共享Data。但是当读取Data时,如果是线程一则无限wait。看下程序的输出:
waitTest2 ...data
程序会输出线程二的打印。这说明线程一在进入wait时,释放了锁,其他线程可以继续进入getData方法。
下面我们修改Data类,将wait换成sleep之后
static class Data {
private String sd = "data";
private synchronized String getData() throws InterruptedException {
while (Thread.currentThread().getName().equals("thread1")) {
Thread.sleep(1000);
}
return sd;
}
}
运行程序,发现程序一直在跑,但是并没有输出线程二的打印语句。这说明如果我们使用sleep,线程进入休眠时,线程二也不能进入,因为锁一直被线程一占住。
Sleep 和 Wait 关于锁释放的区别的更多相关文章
- java 哪些情况下会使对象锁释放
Java_多线程_锁释放 问:Java多线程运行环境中,在哪些情况下会使对象锁释放?答:由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的 ...
- synchronized同步代码块锁释放
今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637 问题线程的内容. &quo ...
- 对象的notify方法的含义和对象锁释放的三种情况
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...
- XEvent--Demo--使用XEvent来捕获在数据库DB1上发生的锁请求和锁释放
--==============================================================--使用XEvent来捕获在数据库DB1上发生的锁请求和锁释放--=== ...
- 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别
1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...
- 深入浅出 Java Concurrency (9): 锁机制 part 4 锁释放与条件变量 (Lock.unlock And Condition)
本小节介绍锁释放Lock.unlock(). Release/TryRelease unlock操作实际上就调用了AQS的release操作,释放持有的锁. public final boolean ...
- [Java并发] AQS抽象队列同步器源码解析--独占锁释放过程
[Java并发] AQS抽象队列同步器源码解析--独占锁获取过程 上一篇已经讲解了AQS独占锁的获取过程,接下来就是对AQS独占锁的释放过程进行详细的分析说明,废话不多说,直接进入正文... 锁释放入 ...
- ReentrantLock 锁释放源码分析
ReentrantLock 锁释放源码分析: 调用的是unlock 的方法: public void unlock() { sync.release(1); } 接下来分析release() 方法: ...
- ZooKeeper 分布式锁 Curator 源码 02:可重入锁重复加锁和锁释放
ZooKeeper 分布式锁 Curator 源码 02:可重入锁重复加锁和锁释放 前言 加锁逻辑已经介绍完毕,那当一个线程重复加锁是如何处理的呢? 锁重入 在上一小节中,可以看到加锁的过程,再回头看 ...
随机推荐
- javascript 中function(){}(),new function(),new Function(),Function
和java比起来,javascript真的是松散的无以复加,不过这也让我们在无聊之余,有精力去探讨一些复杂的应用,从而在开发之路上,获得一些新的想法. javascript中的类的构造 javascr ...
- 《C程序设计II》简易计算器,杨辉,数字杯子图形
<C程序设计II>简易计算器,杨辉,数字杯子图形.<C程序设计II>简易计算器,杨辉,数字杯子图形.<C程序设计II>简易计算器,杨辉,数字杯子图形. <C程 ...
- MySql8最新配置方式(完美)
下载MYSQL8 地址:https://www.mysql.com/downloads/ 1.滑动网页到最下面,选择Community (GPL) Downloads » 2.选择MySQL Comm ...
- Android 远程连接数据库。。。。。
本来是 6.0.6 换成mysql 5.1.14 驱动ok.... 将方法 放在 new Thread() 解决..... 只能在主线程绘制ui.... 解决办法...子Thread 获取数据后,将 ...
- hdu2064 汉诺塔Ⅲ(递归)
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Dockerfile的书写规则和指令的使用方法
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命 ...
- Python3 PIL Image 操作文件后导致占用问题
需求:按图片分辨率范围分类图片(每个商品有N张图片在一个目录内). 实现:用PIL Image打开图片并读取宽度和高度.然后按不同分辨率存档到不同目录. 问题:从原有目录移动到目标目录时出现 “Per ...
- junit使用中的一些问题
之前开发过程中的测试,不是使用main方法,就是启动项目调用地址,尤其是后者,测试起来非常不方便,今天配置了下junit,中间遇到些问题,记录如下. 首先下载spring-test.jar包和juni ...
- 虚拟机安装MySQL报** is needed by **错误
执行命令: [root@node1 local]# rpm -ivh mysql-community-server-8.0.12-1.el7.x86_64.rpm 安装MySQL遇到以下问题: err ...
- Mybatis学习笔记16 - bind标签
1.${}拼串进行模糊查询,不安全 示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import java ...