多线程的输出顺序[JAVA]

package com.example.test;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* @ author ZHANG

* @ create 2022/3/31$ 16:33$

*/

public class testLock {

public static Lock lock = new ReentrantLock();

public static int count = 0;

public static Condition conditionA = lock.newCondition();

public static Condition conditionB = lock.newCondition();

public static void main(String[] args) {

Thread t1 = new Thread() {

@Override

public void run() {

lock.lock();

if (count < 5) {

System.out.println("线程1未达到业务要求,暂停中,等待线程2处理到达到要求后唤醒");

try {

conditionA.await();// 暂停线程并释放锁

System.out.println("conditionA被唤醒");

System.out.println("-----即将再次睡着");

Thread.sleep(5000);

conditionB.await();

System.out.println("conditionB被唤醒");

System.out.println("我是线程1后面的代码");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

lock.unlock();

}

};

Thread t2 = new Thread() {

@Override

public void run() {

lock.lock();

while (count < 10) {

count++;

System.out.println("线程2业务处理中: " + count);

try {

Thread.sleep(1000);

if (count == 5) {

conditionA.signal();

System.out.println("唤醒线程1");

lock.unlock();// 调用signal()方法后,线程2并不会释放锁,需要手动释放线程2才会执行

System.out.println("unlock后能否打印");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

try {

lock.lock();// 不加这个会报java.lang.IllegalMonitorStateException

System.out.println("等待3秒后conditionB会被唤醒");

Thread.sleep(3000);

conditionB.signal();

} catch (InterruptedException e) {

e.printStackTrace();

}

lock.unlock();// 这里释放锁,线程2执行完,线程1才会执行

}

};

t1.start();

t2.start();

Thread.currentThread().interrupted();

}

}

请问以上代码,为什么会输出一下结果:
线程1未达到业务要求,暂停中,等待线程2处理到达到要求后唤醒
线程2业务处理中: 1
线程2业务处理中: 2
线程2业务处理中: 3
线程2业务处理中: 4
线程2业务处理中: 5
唤醒线程1
unlock后能否打印
线程2业务处理中: 6
conditionA被唤醒
-----即将再次睡着
线程2业务处理中: 7
线程2业务处理中: 8
线程2业务处理中: 9
线程2业务处理中: 10
等待3秒后conditionB会被唤醒
conditionB被唤醒
我是线程1后面的代码

调用unlock()后是执行完后续的6-10,再释放锁,还是当即就释放?
为什么6会在conditionA被唤醒的前面?
感谢各位大佬解答!


回答:

你 unlock 之后 t2 已经没有锁,之后所有的打印与 t1 种的相对关系都是没有任何保证的。

以上是 多线程的输出顺序[JAVA] 的全部内容, 来源链接: utcz.com/p/944329.html

回到顶部