`
maosheng
  • 浏览: 550838 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 多线程归纳

    博客分类:
  • Java
阅读更多
Threads are running in the same application,they share the same memory space in the computer.this allows them to share information seamlessly.





Synchronized关键字在语法上有两种形式:作用于程序块和方法

块同步需要一个参数来表明锁住的是哪个对象,这种方式使得任何一个方法都可以锁住任何一个对象,同步块最常用的参数就是this。

Synchronized关键字不属于方法签名的一部分,所以当子类覆盖父类方法时,Synchronized修饰符不会被继承。因此接口中的方法不能被声明为Synchronized,同样地,构造函数不能被声明为Synchronized。

线程实现取消最常见的方法都依赖于每个线程的中断状态,中断状态可以通过调用Thread.interrupt来设置,调用Thread.isInterrupted来查询,调用Thread.interrupted来查询并清除。

在Object.wati,Thread.join.,Thread.sleep中,中断状态检测是自动执行的,这些方法在遇到中断时,会抛出InterruptedException异常以中断当前的操作,使得线程可以被唤醒并执行取消操作。

正如每个Object都有一个锁,每个Object也有一套等待集合(wait set),他由wati,notify,notifyAll和Thread.interrupt方法来操作。每个对象的等待集合都是维护在JVM内部的,等待集合一直保存着那些因调用对象wait方法而被阻塞的线程,直到接受到相应的通知或者该等待集合被释放。由于等待集合和锁之间的交互机制,只有获得对象的同步锁时,才可以调用他的wait,notify,notifyAll的方法。

wait方法被调用后,会执行如下操作:

1.如果当前线程已被中断,那么该方法立即退出,然后抛出一个InterruptedException异常,否则,当前线程被阻塞。

2.JVM把该线程放入目标对象内部且无法访问的等待集合中

3.目标对象的同步锁被释放,但是这个线程所拥有的其他锁依然被这个线程保留着。

notify方法被调用后,会执行如下操作:

1.如果存在的话,JVM从目标对象内部的等待集合中任意地移除一个线程T,如果等待集合中的线程数大于1,那么哪个线程被选中完全是随机的。

2.线程T必须重新获得目标对象的目标锁,这必然导致他将被阻塞直到调用Thread.notify的线程释放该同步锁。如果其他线程在线程T获得此锁之前就获得它,那么线程T就要被一直阻塞下去。

3.线程T从执行wait的那点恢复执行

notifyAll方法被调用后,会执行如下操作:

notifyAll方法调用后执行的操作同notify类似,不同的只是等待集合中所有的线程同时都要执行那些操作,然而,由于他们必须要先获得目标对象的同步锁,所以只有一个线程可以继续操作。

interrupt方法被调用后,会执行如下操作:

如果对一个因调用了wait而被挂起的对象调用Thread.interrupt方法,那么这个方法的执行机制就和notify类似,只是在重新获得对象锁后,该方法就会抛出InterruptedException异常,并且该线程的中断状态将被设置为false.如果interrupt和notify同时发生,那么哪个操作会被执行完全是随机的,所以两种结果都是有可能的。





  • 大小: 322.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics