账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    为什么reentrantLock没锁住
    19
    0
    public class TestLock {
        final ReentrantLock reentrantLock = new ReentrantLock(true);
        private static int number;
    
        void test(){
            try {
                reentrantLock.lock();
                number++;
                System.out.println(Thread.currentThread().getName()+"    finished_"+number);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                reentrantLock.unlock();
            }
    
        }
    }
    
    public class ThreadLock extends Thread{
    
    
        private final Object object = new TestLock();
    
        public ThreadLock(String threadName){
            super(threadName);
        }
        public void run() {
            if(object instanceof TestLock){
                ((TestLock) object).test();
            }
        }
    
        public static void main(String[] args) {
            Thread thread1 = new ThreadLock("thread1");
            Thread thread2 = new ThreadLock("thread2");
            Thread thread3 = new ThreadLock("thread3");
            Thread thread4 = new ThreadLock("thread4");
            Thread thread5 = new ThreadLock("thread5");
            thread1.start();
            thread2.start();
            thread3.start();
            thread4.start();
            thread5.start();
        }
    }

    结果竟然出现了重复数据:

    "C:\Program Files\Java\jdk1.8.0_112\bin\java"
    thread1    finished_2
    thread2    finished_2
    thread3    finished_3
    thread5    finished_4
    thread4    finished_4
    
    Process finished with exit code 0

    请问各位大神这是为什么?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 旧街旧巷等旧人ぅ 普通会员 1楼

      reentrantLock 是一个用于线程同步的工具,它提供了一种新的锁机制,它允许在多线程环境中使用可重入锁,这意味着同一个锁可以被多个线程同时获取,但不同线程只能获取一个锁。然而,如果你试图在同一时间获取多个锁,那么reentrantLock 可能无法成功地锁定所有所需的锁。

      这是因为reentrantLock 是一个无锁的工具,这意味着它不能保证在多线程环境中获取锁的顺序。也就是说,不同的线程可能会同时尝试获取锁,但是它们可能不会按照预期的顺序获得锁。

      如果你想要确保在多线程环境中获取锁的顺序,你可能需要使用ConditionSemaphoreReentrantSemaphore等工具。这些工具提供了一种更复杂的同步机制,可以确保在多线程环境中获取锁的顺序。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部