java线程基本知识

线程的调度不是跨平台的,它不仅仅取决于java虚拟机,还依赖于操作系统,到底采用哪种调度和特定的JVM有关。

一、JVM线程调度:在多cpu上同时只能运行一个线程,可以在平台间很好的移植,从系统角度看,一个运行的程序只有一个JVM进程和一个线程,其他线程都是JVM的抽象标示,由jvm全权负责调度,对系统来说完全透明。
1.基于优先级的调度(高优先级获取低优先级持有的锁,高优先级优先运行)
2.相同优先级的线程 抢占式,也可能根据运行状态JVM自行调度

操作系统线程调度:
二、1.基于优先级的调度(高优先级获取低优先级持有的锁,低优先级的优先级会被提高到和高优先级相同)
2.相同优先级的线程 时间片(不过window基于时间片)
3.一定时间没得到运行的线程,会自动的提高运行1个优先级别

yeid方法:
1.被调用的线程,处于就绪态
2.对于系统中无同一优先级别的线程,该方法无效,不建议使用
3.调用后,只会给同等优先或更高级别线程运行的机会,不会给低优先级别线程运行的机会,和sleep不同

sleep方法:
1.不会释放线程持有的锁
2.进入阻塞状态
3.指定的毫秒级的会被转化为平台最小分辨率

wait方法:
1.释放线程持有的锁
2.进入阻塞状态

join方法
1.执行后线程进入阻塞状态
2.对自身线程调用会进入永久等待

isAlive方法:
1.可以检测run方法是否结束
2.对自身线程调用永远返回true

线程同步:
1.在类中使用同步方发,默认是锁定this对象
2.对double与long类型的变量进行设值操作是线程不安全的,因为该变量的某些位有线程A设置,某些位又由线程B设置
3.对类的静态方法用synchronize修饰,获得是类锁
4.同步要基于实际对象为原则,不能基于对象的引用,因为对象的引用指向可变
5.在同步块中若有return语句或异常发生,也会自动释放锁
6.用于线程同步的变量必须申明为valotile

等待和通知:
1.不在同步块中调用wait/notify方法,语法出错
2.如有多线程在等待的话,notigy方法并不确定唤醒的是哪一线程
3.一般建议使用notifyAll

 在java系统中,线程异常退出会自动释放持有锁
stop方法不建议使用,原因就是它是抛出异常工作的,导致某些关键资源处于不一致的状态

线程安全:
1.无状态的对象是线程安全的
2.不要延迟初始化的竞争条件
3.锁是可重入的
4.不要在没有同步情况下使用共享变量
5.多线程操作64bit的变量是线程不安全的,例如long,double
6.锁定可以保证双方的知名度和原子; volatile变量只能保证能见度

猜你喜欢

转载自hegan-2009.iteye.com/blog/1317638