多线程中对关于synchronized,sleep以及wait,notify的一些理解

1、synchronized:线程会执行完它所修饰的方法/代码块。线程a在执行此方法/代码块时,其他线程也想调用时发现锁被占用,所以进入阻塞状态,cpu在进行分配时间片时不会分配给阻塞状态的线程,所以还是将时间片分配给线程a(这一段是在别人的博客了解到的,没有深究)所以线程a一直占用锁,直到运行完该方法/代码块才会释放锁(或者发生异常,释放锁)。简单来讲,只有synchronized时,并且方法中没有涉及sleep,wait等等,线程是直接将方法执行完的。

2、在synchronized方法/代码块 中执行了Thread类的静态方法sleep()时不会释放锁,并且线程睡醒之后继续往下执行。

3、在synchronized方法/代码块 中执行了对象.wait()方法,此时释放锁,使用对象.notify()唤醒线程,然后继续从等待的地方往下继续执行(如果wait方法处于if判断中,无论条件是否符合都是继续往下执行

public class WaitTest implements Runnable{
    private static Boolean flag = true;
    @Override
    public synchronized void run() {

        System.out.println("线程进入到了run方法");
        try {
            if(flag){
                this.wait();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 5; i++) {
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        new Thread(waitTest).start();

        try {
            //让main线程睡3秒,免得main线程执行太快直接将flag变为false
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = false;
        synchronized (waitTest){
            //将线程唤醒
            waitTest.notify();
        }
    }
}

以上代码是对线程执行了wait方法挂起之后,经过唤醒后是否继续执行的验证,说明线程被重新唤醒后并不是重新执行方法,而是继续往下执行,并且我这里加了一个if判断,挂起前是true,唤醒之后不符合if的条件(唤醒之后不管是否符合if的条件都是直接执行!),但是线程还是继续执行,不是重新运行方法哦,这里需要注意的。

    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        new Thread(waitTest).start();

        try {
            //让main线程睡3秒,免得main线程执行太快直接将flag变为false
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
//        flag = false;
        synchronized (waitTest){
            //将线程唤醒
            waitTest.notify();
        }
    }

上面的代码是将main线程修改标志位的代码注掉了,所以按照逻辑是main线程将子线程唤醒之后,flag仍为true,但是子线程仍旧执行了后面的代码

 所以说,唤醒之后子线程并不会重新判断if中的条件是否符合,直接继续执行下去(多线程推荐使用while循环判断

4、还需要注意的一点是,wait和notify,notifyAll是基于synchronized使用的,必须一起使用,不然报错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值