ReenTrantLock可重入锁、和synchronized的区别

 synchronized同步锁、ReentrantLock可重入锁(java.util.concurrent.locks.Lock)的区别

引用:https://blog.csdn.net/iteye_494/article/details/82654607

Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如锁投票、定时锁等候、可中断锁等候等

synchronized 是Java内置的关键字,Lock 则是JDK 5中出现的一个包

synchronized 同步的代码块可以由JVM自动释放;Lock 需要程序员在finally块中手工释放

ReentrantLock是concurrent.locks的一个类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁

(2)ReentrantLock可以获取各种锁的信息

(3)ReentrantLock可以灵活地实现多路通知

4、 ReadWriteLock

        由于ReentrantLock某些时候有局限。如果使用ReentrantLock,可能本身是为了防止线程A在写数据、线程B在读数据造成的数据不一致,但这样,如果线程C在读数据、线程D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。因为这个才诞生了读写锁ReadWriteLock。ReadWriteLock是一个读写锁接口,ReentrantReadWriteLock是ReadWriteLock接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。

sleep和wait的区别

引用:https://blog.csdn.net/a4227139/article/details/76644901

sleep:

   1:属于Thread类,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态

   2:sleep方法没有释放锁

   3:sleep必须捕获异常

wait:

   1:属于Object,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程

   2:wait方法释放了锁

   3:wait不需要捕获异常

   Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。

    wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。

线程死锁

引用:http://www.cnblogs.com/wy697495/p/9757982.html

死锁产生的原因:

多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。死锁产生的四个必要条件:

1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

对象锁(synchronized method{})和类锁(static sychronized method{})的区别

对象锁是用来控制实例方法之间的同步,当多个线程访问多个实例时,每个对象都拥有自己的锁,对象锁防止在同一个时刻多个线程访问同一个对象的synchronized块。

类锁是用来控制静态方法之间的同步的,类锁是Class对象的锁。

同步和异步

同步:例如正在写的数据以后可能被另一个线程读到,这些共享数据必须进行同步存取。 
异步:当应用程序调用了一个需要很长时间执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程。

未完。。。

猜你喜欢

转载自blog.csdn.net/sinat_41144773/article/details/89428023