Thread proorityes:
highly system dependent
xp 系统有level,linux没有poriority 。 不能依靠priority来完成程序正确性。
如果有好几个高priority的不会blocked的线程,容易出现低poriority线程饥饿现象。
Daemon Thread
如果只剩daemon thread 虚拟机就会推出。(辅助线程,timer)
thread Group
g.activeGroup() , a.interrupt(); (executors 可以不用group关闭一组线程)
Handlers for Uncaught Exceptions
t.setDefaultUncaughtExceptionHandler(); 实现 UncauthtExceptionHandler Method
如果没有提供handler,则调用threadGroup的。
Lock (jdk1.5引入)
lock(); unlock();
lock对象对应多个condition对象
lock.newConditiong();
await()调用:
while( ! (ok of proceed)){ condition.await();};
带可能引起conditoin变化的地方调用,conditon.signalAll();
一个线程调用了condition对象的await方法,那么就把命运交给了其他线程。如果其他地方没有调用condition的唤醒,那么这个线程将会一直阻塞,可能导致死锁。
synchronize关键字:
每个object都有一个隐藏的lock对象,用synchronize关键字就是隐式调用lock()和unlock();
调用wait()和notifyAll()就是显示调用隐藏lock对象的条件对象的await()和signalAll();
隐式Lock对象和Condition对象的drawback:
!不能interrupt一个正在获取锁的线程。
!不能给定一个获取锁的timeout
!只有一个条件对象
!虚拟机执行锁映射的效率问题。
advantages:
虚拟机检测器可以报告lock和conditon的状况,对于调试deadlock来说很useful。
Monitor:
Monitor是面向对象的一种同步概念:
Monitor类只有private fields
所有的方法都会获得Monitor默认的一个锁
java的区别:
Fields不强制要求是private
不是所有方法都要求是synchronized
Synchronized Block
Synchronized (lock){
......
}
为了使用对象的锁。(遗留代码)
static 的方法也是可以同步的,这是他获取的是.class 对象的锁
Volatile Fields
private volatile boolean done; //这样就不用锁了,默认加锁。 影响性能
死锁:
公平锁:new ReentrantLock(true),不会出现饿死,严重影响性能,不推荐
锁测试和超时:
myLock.tryLock(long time, TimeUnit unit); //有助于消除死锁
读写锁:
rwl = new ReentrantReadWriteLock();
Lock readLock = rwl.readLock();
Lock writeLock = rwl.writeLock();
为什么不用stop和suspend
stop:会倒是对象处于不一致状态,刚执行一半。(不是有些人说的不会释放对象的锁,因为对象可以抛出ThreadDeath异常来释放所有的锁。
suppend:不会释放对象的锁,很容易造成死锁。