java多线程之(二)锁

一,锁

在对象的创建时java会为每个object对象分配一个monitor( 监视器或者监视锁),当某个对象的同步方法(synchronized methods )被多个线程调用时,该对象的monitor将负责处理这些访问的并发独占要求。
当一个线程调用一个对象的同步方法时(synchronized ),JVM会检查该对象的monitor。如果monitor没有被占用,那么这个线程就得到了monitor的占有权,可以继续执行该对象的同步方法;如果monitor被其他线程所占用,那么该线程将被挂起,直到monitor被释放。
当线程退出同步方法调用时,该线程会释放monitor,这将允许其他等待的线程获得monitor以使对同步方法的调用执行下去。
注意:Java对象的monitor机制和传统的临界检查代码区技术不一样。java的一个同步方法并不意味着同时只有一个线程独占执行,但临界检查代码区技术确实会保证同步方法在一个时刻只被一个线程独占执行。Java的monitor机制的准确含义是:任何时刻,对一个指定object对象的某同步方法只能由一个线程来调用。
java对象的monitor是跟随object实例来使用的,而不是跟随程序代码。两个线程可以同时执行相同的同步方法,比如:一个类的同步方法是xMethod(),有a,b两个对象实例,一个线程执行a.xMethod(),另一个线程执行b.xMethod(). 互不冲突,原因就是因为使用的是对象锁(方法锁属于对象锁)并非类锁,而a和b是两个实例对象。

二,同步锁和互斥锁

互斥锁,是所有的线程共同来争夺资源实现对资源的独占,执行没有顺序,谁抢到谁执行,抢不到就继续竞争。

同步锁,是多个线程按照一定的约定好的顺序执行,他们互相之间知道对方的存在,彼此之间起着相互合作的关系。

三,死锁

死锁是因为两个或者两个以上的线程在对公共资源的争夺竞争过程中出现的一种阻塞现象,如果没有外力的作用这种现象将会持续下去。

死锁产生的条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

猜你喜欢

转载自blog.csdn.net/IPI715718/article/details/83713563