Java 线程笔记

来源:互联网 发布:数据冗余错误 编辑:程序博客网 时间:2024/05/16 19:25

sleep、wait、yield区别

第一:

sleep是Thread对象里面的方法;

wait是Object对象里面的方法;

第二:

当一个synchorized成员sleep的时候并不会释放掉synchorized;

但是当一个synchorized成员wait的时候是会释放掉synchorized的;

第三:

一个对象在sleep的时候是有时间设定限制的,除非在sleep设定时间内被中途打断,就会抛出InterruptedException异常;

一个对象在wait的时候没有时间限制,会让对象一直暂停下去,当有其他对象去调用他的notify或者调用全局的notifyAll的时候才会开始继续执行。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常

 

 

sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。(转)

 

四种方式 sychronized关键字

       sychronized method(){}
  sychronized (objectReference) {/*block*/}
  static synchronized method(){}
  sychronized(classname.class)
  其中1和2是代表锁当前对象,即一个对象就一个锁,3和4代表锁这个类,即这个类的锁
  要注意的是sychronizedmethod()不是锁这个函数,而是锁对象,即:如果这个类中有两个方法都是sychronized,那么只要有两个线程共享一个该类的reference,每个调用这两个方法之一,不管是否同一个方法,都会用这个对象锁进行同步。锁类的3和4类推,即该类的不同reference调用了sychronized区段的咚咚就会受类锁的控制

 

 

线程安全五个等级

      immutable  不可变对象
  thread-safe 线程安全的,可以放心使用,如java.util.Timer
  conditionally thread-safe 条件线程安全的,如Vector和Hashtable,一般是安全的,除非存在几个方法调用之间的顺序不能被打断,这时可以用额外的锁来完成
  thread-compatible 可以使用synchronized (objectReference)来协助完成对线程的调用
  thread-hostile 不安全的

原创粉丝点击