b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

java多线程死锁 java的两种同步方式, Synchronized与R

电脑杂谈  发布时间:2018-02-11 19:23:50  来源:网络整理

java多线程死锁_concurrent包_多线程面试题

java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。

相似点:

这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善)。

区别:

这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。

1.Synchronized

Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。

查看字节码指令:

技术分享图片

2.ReentrantLock

由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:

1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。java多线程死锁

多线程面试题_concurrent包_java多线程死锁

2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。java多线程死锁

3.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。

ReentrantLock的用法如下:

publicclassSynDemo{

publicstaticvoidmain(String[]arg){

Runnablet1=newMyThread();

newThread(t1,"t1").start();

newThread(t1,"t2").start();

}

}

classMyThreadimplementsRunnable{

privateLocklock=newReentrantLock();

java多线程死锁_多线程面试题_concurrent包

publicvoidrun(){

lock.lock();

try{

for(inti=0;i<5;i++)

System.out.println(Thread.currentThread().getName()+":"+i);

}finally{

lock.unlock();

}

}

}

对ReentrantLock的源码分析这有一篇很好的文章

java的两种同步方式, Synchronized与ReentrantLock的区别

标签:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-72333-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 陈孟攀
        陈孟攀

        也许美国会派兵抓你回美国

      热点图片
      拼命载入中...