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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    线程竞争资源时候有没有先后顺序
    71
    0

    假设线程1执行了wait(),线程2获取到了锁资源,与此同时线程3启动执行synchronized竞争锁资源,线程2在结束之前使用了notifyAll()唤醒线程1,那么线程1和线程3谁能获取到锁是随机的吗?
    在我的理解中,是随机的,但是现在的实际情况是线程1会获取到资源
    请问是我理解错了吗,请说明一下。

    还有就是线程1执行了wait之后,线程4先获取到锁资源,但是也执行了wait,然后按照上面的继续进行下去的,在线程2结束的时候,为什么会执行线程1和线程4。

    public class ThreadTest {
        public static void main(String[] args) {
            Object co = new Object();
            System.out.println(co);
    
            for (int i = 0; i < 10; i++) {
                MyThread t = new MyThread("Thread" + i, co);
                t.start();
            }
    
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("-----Main Thread notify-----");
                synchronized (co) {
                    co.notify();
                }
                TimeUnit.SECONDS.sleep(2);
                System.out.println("Main Thread is end.");
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        static class MyThread extends Thread {
            private String name;
            private Object co;
    
            public MyThread(String name, Object o) {
                this.name = name;
                this.co = o;
            }
    
            @Override
            public void run() {
                System.out.println(name + " is waiting.");
                try {
                    synchronized (co) {
                        co.wait();
                    }
                    System.out.println(name + " has been notified.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    

    比如说这个代码,先不管他会造成死锁,问题是main中那个notify释放的,一定会是第一个执行wait的,难道不是随机的吗??

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 暮雨声寒 普通会员 1楼

      线程竞争资源通常是指多个线程同时请求同一资源,可能导致线程死锁或者程序运行缓慢的情况。

      在多线程编程中,资源的获取顺序并不是一定的。如果多个线程同时申请一个资源,而没有正确地管理资源的获取顺序,那么可能会出现资源争夺的情况。例如,一个线程在申请资源后,等待其他线程释放资源,如果其他线程已经释放了资源,那么这个线程就无法再申请资源,这就可能导致线程死锁。

      为了避免这种情况,可以使用一些同步机制来管理资源的获取顺序。例如,可以使用锁、信号量、条件变量等同步机制来控制线程的资源获取顺序。

      此外,还需要注意,线程竞争资源的情况也会受到系统资源的限制。如果系统的资源有限,那么线程之间的竞争可能会导致系统的资源消耗过快,影响系统的性能。

      因此,线程竞争资源时,需要根据具体的情况来选择合适的同步机制,以保证线程的正确运行。

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