码迷,mamicode.com
首页 > 编程语言 > 详细

Java线程 synchronized、Lock、Condition

时间:2015-06-20 18:22:01      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

java.util.concurrent.lock 中的Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。

ReentrantLock 类实现了Lock ,它拥有与synchronized 相同的并发性和内存语义,但是添加了类似锁投票定时锁等候可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)

  • class  Lock lock =  ReentrantLock();  
  •   output(String name) {           
  •   
  •  {    
  • ( i = ; i < name.length(); i++) {    
  •  {    
  •   
  • }    

 

区别:

需要注意的是,用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而是用Lock需要我们手动释放锁,所以为了保证锁最终被释放(发生异常情况),要把互斥区放在try内,释放锁放在finally内!!

3、读写锁ReadWriteLock

上例中展示的是和synchronized相同的功能,那Lock的优势在哪里?

例如一个类对其内部共享数据data提供了get()和set()方法,如果用synchronized,则代码如下:

  • class   data;  
  •    set( data) {    
  • );    
  •  {    
  • );    
  •  (InterruptedException e) {    
  • .data = data;    
  •  + .data);    
  •     get() {    
  • );    
  •  {    
  • );    
  •  (InterruptedException e) {    
  •  + .data);    
  • }    

 

然后写个测试类来用多个线程分别读写这个共享数据:

  • public  main(String[] args) {    
  • //        final Data data = new Data();    syncData data =  syncData();    
  • //        final RwLockData data = new RwLockData();     
  •  ( i = ; i < ; i++) {    
  •  Thread( Runnable() {    
  •   
  •   run() {    
  •  ( j = ; j < ; j++) {    
  •  Random().nextInt());    
  •  + i);  
  •   
  •  ( i = ; i < ; i++) {    
  •  Thread( Runnable() {    
  •   
  •   run() {    
  •  ( j = ; j < ; j++) {    
  •  + i);  
  •     }    

Java线程 synchronized、Lock、Condition

标签:

原文地址:http://www.cnblogs.com/free-vip-com/p/4590760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!