OO_U2 - 电梯

这是一篇导航帖。

本单元任务较忙,故我没有时间整合出一篇概括所有内容的文章。

博客周作业做了一些概括,但是我觉得里面我自己省掉了不小好玩的细节。

以下文章均与本单元有关,欢迎各位按需查阅:

杂记

单元前序知识:Java多线程

synchronized关键词有三种可能的修饰对象:

  • 实例方法:public synchronized void method() {}
    实例(this)的锁,或者说,对象锁。
    其他线程在该锁释放前,无法访问该实例的synchronized方法(言下之意,非synchronized可以访问)
  • 静态方法:public static synchronized void method(){}
    锁定,锁定后,其他线程无法访问该类的sync方法
  • 代码块:锁对象锁,和第一个一致。
    1
    2
    3
    4
    5
    public void method() {
    synchronized (Object) {

    }
    }

对象锁的行为

经过实验,发现:

  • 在对象锁被一个进程占用时,其他线程无法访问该对象的synchronized方法,但可以访问没加sync的方法,甚至由此对对象的属性进行更改
  • Obj的对象锁被一个进程占用时,其他线程在执行到synchronized (Obj) {}代码块处会被阻塞。
  • 对象锁针对的是对象,而不是方法;因此,调用一个sync方法method1()method1()又调用另一sync方法method2(),是不会被阻塞的,因为当前线程一直拿着对象的锁。可能会带来预期外的不阻塞

wait()notifyAll()

Obj.wait()会暂停线程A(A此时拥有Obj的锁)的执行,直到另一线程B使用Obj.notifyAll()将其唤醒。

同时,Obj.wait()会释放线程A拥有的Obj

notify()随机唤醒等待池中的一个程序,而notifyAll()全部唤醒。

Thread类

涉及Runnable的太复杂,我们选择直接extends Thread,随后重写run()实现启动线程。

只有start()会创建新线程,run()只会顺序执行代码块。

确定要保护的方法

在一个对象里,如果出现了要多线程共享的属性,那引用该属性的方法全部都要保护

作者

LajiPZ

发布于

2025-04-17

更新于

2025-04-21

许可协议

评论