JAVA多线程我的总结

来源:互联网 发布:编程真好玩 pdf 编辑:程序博客网 时间:2024/05/17 22:17

以下总结主要针对jdk1.4, 不包括1.5之后的新特性

1. 线程的状态:New, Runnable, Blocked, Dead, 线程状态图见Core Java(page20)
Java 线程状态不同于OS教材中的状态,没有Running和Ready, 其实这两个状态隐含在Runnable这个状态中了

2. Thread.yield()方法放弃当前线程的运行,重新调度,不阻塞当前线程。注意它是Thread的静态方法

3. interrupt() , 中断当前线程,即使是sleep()中,也是退出sleep()的不二法则

4. 出现下列情况, 线程block
a) sleep(), 它不释放lock
b) I/O操作
c) wait(), 释放lock
d) 同步方法块等lock

5. 下列情况,退出block
a) sleep 结束
b) I/O结束
c) notify/notifyAll了wait在锁后面的线程,注意notify随机唤醒一个线程,其他继续wait, notifyAll唤醒所有的线程,这些线程将竞争lock

6. t.join, 是当前线程等待,直到t线程结束运行

7. volatile, 保证变量与主存一致,但它不能确保原子性

8. 一个对象synchronized方法可以调用该对象的另一个synchronized方法,因为这条执行path拿的是同一个锁

9. wait/notify/notifyAll是Object的方法,他们只能在synchronized方法或块中使用,应为他们控制lock

10. synchronized不能继承

11. 构造函数不能synchronized

12. 加锁3大原则
a) 永远只是在更新对象的成员变量时加锁
b) 永远只是在访问可能被更新对象的成员变量时加锁
c) 永远不要再调用其他对象(不包括成员对象)时加锁