请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于synchronized不公平锁

for (int i = 0; i < 2; i++) {
synchronized (queuelock){
// queuelock.lock();
try {
Integer duration = new Random().nextInt(1) + 1;
System.out.println(Thread.currentThread().getName() + " 正在打印,需要 " +
duration + " 秒");
try {
Thread.sleep(duration * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
// queuelock.unlock();
}
}

        打印:

Thread-0开始打印
Thread-0 正在打印,需要 1 秒
Thread-1开始打印
Thread-2开始打印
Thread-3开始打印
Thread-4开始打印
Thread-5开始打印
Thread-6开始打印
Thread-7开始打印
Thread-8开始打印
Thread-9开始打印
Thread-0 正在打印,需要 1 秒
Thread-0打印完毕
Thread-9 正在打印,需要 1 秒
Thread-9 正在打印,需要 1 秒
Thread-9打印完毕
Thread-8 正在打印,需要 1 秒
Thread-8 正在打印,需要 1 秒
Thread-8打印完毕

synchronized难道不是阻塞队列,而是阻塞栈吗老师?

正在回答 回答被采纳积分+3

1回答

悟空 2020-03-30 00:57:43

最好不要用一个可变对象来做为锁对象,你可以用一个独立的Object

1 回复 有任何疑惑可以回复我~
  • 提问者 灵森 #1
    感谢老师深夜解答,使用了    private  static final Object object=new Object() ; synchronized(object)还是出现了阻塞栈的效果。123456789 输出却是987654321
    回复 有任何疑惑可以回复我~ 2020-03-30 01:16:51
  • 提问者 灵森 #2
    尝试请求同步块的线程次序依次是Thread 0-9,而后续成功获得锁的线程次序却是Thread 9-0,难道不是队列中排在前面的线程,先获取释放的锁吗??
    回复 有任何疑惑可以回复我~ 2020-03-30 01:33:50
  • 悟空 回复 提问者 灵森 #3
    synchronized是非公平锁,没有限定,也不能确定下一个获得锁的是哪个线程。
    回复 有任何疑惑可以回复我~ 2020-03-30 09:55:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信