java 线程 以及wait()和notify()

来源:互联网 发布:mysql 最近一条记录 编辑:程序博客网 时间:2024/04/27 01:57

线程:

同步方法:在同一个进程内多个线程共享内存空间、共享资源,以某顺序来确保该资源在某一个只被一个线程使用。一个对象只有一把与之对应的“对象锁”,线程获得该对象锁,其他线程希望拿到那把锁,只能等待该线程释放对象锁。获得对象锁 有关键字syschronized 

1)实现方法同步:将关键字syschronized添加到方法的声明中

某线程想调用对象中被syschronized修饰的方法,先获得该对象的对象锁,然后再执行方法。其他线程调用该方法的线程被阻塞和暂停执行,直至第一个线程释放对象锁(方法执行完之后对象锁自动释放)

syschronized修饰的方法在同一时间只能被多个线程执行。

syschronized修饰的方法在同一时间只能被同一个线程执行。

2)若共享的是静态数据,利用静态同步方法来保护静态数据

3)类锁:每个类都有一个类锁,两个线程不能同时执行同一个类上的静态方法。一个调用同步静态方法的同步实例方法可获得2个锁(先去到同步实例方法的对象锁,再取到同步静态的类锁,实例方法比静态方法先调用)

4)不要对run()方法进行同步,供多个线程并行执行。


start():native 关键字说明是原生函数,用c/c++实现的,用做java 和其他语言(如c++)进行协作时用的 也就是native 后的函数的实现不是用java, native funtion():是操作系统函数,java只能调用。native不能和abstract关键字一起用,native的方法可以创建实例。

native是和操作系统和java外部环境交互


------------------------------------------------------------------------------------------------------

因为waitnotify方法定义在Object类中,因此会被所有的类所继承。这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。

wait()方法:使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。

当前的线程必须拥有当前对象的monitor,也即lock,就是锁。

线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行。

要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或synchronized块中。

  一个小比较:

  当线程调用了wait()方法时,它会释放掉对象的锁。

  另一个会导致线程暂停的方法:Thread.sleep(),它会导致线程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。

notify()方法

  notify()方法会唤醒一个等待当前对象的锁的线程。

  如果多个线程在等待,它们中的一个将会选择被唤醒。这种选择是随意的,和具体实现有关。(线程等待一个对象的锁是由于调用了wait方法中的一个)。

  被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。

  被唤醒的线程将和其他线程以通常的方式进行竞争,来获得对象的锁。也就是说,被唤醒的线程并没有什么优先权,也没有什么劣势,对象的下一个线程还是需要通过一般性的竞争。

  notify()方法应该是被拥有对象的锁的线程所调用。

  (This method should only be called by a thread that is the owner of this object's monitor.

  换句话说,和wait()方法一样,notify方法调用必须放在synchronized方法或synchronized块中。

  wait()notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。

  一个线程变为一个对象的锁的拥有者是通过下列三种方法:

  1.执行这个对象的synchronized实例方法。

  2.执行这个对象的synchronized语句块。这个语句块锁的是这个对象。

  3.对于Class类的对象,执行那个类的synchronizedstatic方法。


0 0
原创粉丝点击