OO_U2 - 电梯
这是一篇导航帖。
本单元任务较忙,故我没有时间整合出一篇概括所有内容的文章。
博客周作业做了一些概括,但是我觉得里面我自己省掉了不小好玩的细节。
以下文章均与本单元有关,欢迎各位按需查阅:
杂记
单元前序知识:Java多线程
synchronized关键词有三种可能的修饰对象:
- 实例方法:
public synchronized void method() {};
锁实例(this)的锁,或者说,对象锁。
其他线程在该锁释放前,无法访问该实例的synchronized方法(言下之意,非synchronized可以访问) - 静态方法:
public static synchronized void method(){}
锁定类,锁定后,其他线程无法访问该类的sync方法 - 代码块:锁对象锁,和第一个一致。
1
2
3
4
5public 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()只会顺序执行代码块。
确定要保护的方法
在一个对象里,如果出现了要多线程共享的属性,那引用该属性的方法全部都要保护。
OO_U2 - 电梯