Core java 7 2-1 Multithreading

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:不会释放对象的锁,很容易造成死锁。

你可能感兴趣的:(java,thread,虚拟机,linux,XP)