多线程同步中sleep与wait区别

1、函数

​wait是Object的一个函数,指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(这两个也是Object的函数)。

sleep则是Thread的一个函数,指线程被调用时,占着CPU不工作.此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。

所以

sleep(100L)意思为:占用CPU,线程休眠100毫秒

wait(100L)意思为:不占用CPU,线程等待100毫秒

注意:wait和sleep最终都是调用native函数。

2、多线程

使用多线程就没法绕过同步问题,而wait和sleep对于同步锁也有不同的效果
(1)在使用上,调用obj的wait和notify函数前必须获取对象锁,即在synchronized(obj){...}代码块中。
(2)如果都在synchronized代码块中,wait(obj)函数可以释放锁,而sleep函数则不释放锁。
在wait释放锁这里有一个场景:
有两个线程A和B,在A线程中有如下代码:
synchronized(mLock){
     ...
     mLock.wait();
     ...
}

这样在synchronized处获取对象锁,当执行到wait函数时,线程A进入等待状态,并且释放对象锁。

在B线程中有如下代码:
synchronized(mLock){
     ...
     mLock.notify();
     ...
}

当A的wait函数释放锁时,B线程的synchronized获取了对象锁,开始执行代码。

当执行到notify函数时,唤醒A线程。但是这时由于B的synchronized代码块未执行完,所以未释放锁。所以先执行B线程notify后面的代码,Bsynchronized代码执行完后释放锁,A线程获取锁并执行wait之后的代码。

(注意,如果有多个wait状态的obj,notify函数只能唤醒其中一个,是由JVM决定的,而notifyAll可以唤醒所有的)

测试代码如下:
Thread a = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (mLock){
            Log.e("sss", "a 1");
            try {
                mLock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Log.e("sss", "a 2");
        }
    }
});
Thread b = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (mLock){
            Log.e("sss", "b 1");
            try {
                mLock.notify();
            } catch (Exception e) {
                e.printStackTrace();
            }
            Log.e("sss", "b 2");
        }
    }
});
a.start();
b.start();

打印日志如下:
12-14 18:50:12.909 22793-22824/com.example.testapplication E/sss: a 1
12-14 18:50:12.909 22793-22825/com.example.testapplication E/sss: b 1
12-14 18:50:12.909 22793-22825/com.example.testapplication E/sss: b 2
12-14 18:50:12.909 22793-22824/com.example.testapplication E/sss: a 2

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BennuCTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值