Lock应用之 线程同步

简介:

在Java5 诞生之前,Java线程同步和协助只能使用synchronized锁机制,这种锁机制由JVM直接提供实现,所以经常又称内部锁,也称作对象监视器,由于这种锁有性能缺陷而且灵活不足,所以牛人在Java5添加了Lock接口及相关实现,为Java多线程同步与协作提供了另一种选择,当然,后来者不管功能还是性能都比前者优秀,以致有人倡导全部使用Lock抛弃synchronized。有了竞争就会迫使进步,果然Java 6对内部锁进行优化,性能大幅度提升,大部分情况下与Lock可以相媲美(但非公平竞争情况下Lock还是存在性能优势)而且JCP专家组提倡简单正常情况下使用synchronized内部锁,并称将来内部锁还会继续进行优化,所以现在synchronized还是广为使用。然而这只是性能方面,在功能方面Lock提供了更多的灵活性,如轮询锁、定时锁、可中断的锁获取、非块结构的加解锁等,并且在Java5以后的并发包中广为使用,所以学习研究Lock还是必须的。


1
2
3
4
public  interface  Lock {
void  lock();
void  unlock();
}


对于简单线程同步,Lock使用lock()方法请求并加锁,需要自己使用unlock()方法释放锁,并不需要限定代码范围,如果忘记会造成死锁,这是灵活性带来的负面影响,所以使用时都会增加try{...}finally{lock.unlock()},以保证锁的释放;synchronized在代码块范围外会自动释放锁,一开始就定义好锁定的代码范围,比较死板但可靠,另外synchronized经常用于修饰类成员方法,线程调用这种方法前需要先获得对应的锁,这种使用方式很顺手,简单明了,Lock没有这种语法。


Lock和synchronized对线程同步操作示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import  java.util.concurrent.TimeUnit;
import  java.util.concurrent.locks.Lock;
import  java.util.concurrent.locks.ReentrantLock;
public  class  TestLock {
     private  int  mCount;
     private  Lock mLock;
                       
     public  TestLock(){
         this .mCount =  0 ;
         this .mLock =  new  ReentrantLock();
     }
                       
     public  static  void  main(String[] args)  throws  InterruptedException {
         TestLock testLock =  new  TestLock();
                           
         for ( int  i= 0 ; i< 2 ; i++){
             new  Thread(testLock. new  SThread()).start();
         }
                           
         TimeUnit.SECONDS.sleep( 3 );
                           
         for ( int  i= 0 ; i< 2 ; i++){
             new  Thread(testLock. new  LThread()).start();
         }
     }
                       
     private  void  increaseCount() {
         mCount++;
         System.out.println(Thread.currentThread().getName() +  " do lock, count: "  + mCount);
     }
                       
     private  void  decreaseCount() {
         mCount--;
         System.out.println(Thread.currentThread().getName() +  " do unlock, count: "  + mCount);
     }
                       
     private  void  doCountWithLSync() {
         mLock.lock();
         try {
             increaseCount();
                               
             mLock.lock(); //re-enter
                               
             try {
                 increaseCount();
             }
             finally {
                 mLock.unlock();
                 decreaseCount();
             }                            
         }
         finally {
             mLock.unlock();
             decreaseCount();
         }
     }
     private  void  doCountWithSSync() {
         synchronized ( this ){
             increaseCount();
                               
             synchronized ( this ){ //re-enter
                 increaseCount();
             }
                               
             decreaseCount();
         }
                           
         decreaseCount();
     }
     private  class  LThread  implements  Runnable{
         public  void  run(){
             doCountWithLSync();  
         }
     }
                       
     private  class  SThread  implements  Runnable{
         public  void  run(){   
             doCountWithSSync();
         }    
     }
}





     本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1300164,如需转载请自行联系原作者


相关文章
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
1月前
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
40 4
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
1月前
|
缓存 安全 Java
保障线程安全性:构建可靠的多线程应用
保障线程安全性:构建可靠的多线程应用
|
20天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【4月更文挑战第3天】 在Java并发编程中,线程池是一种重要的资源管理工具,它能有效地控制和管理线程的数量,提高系统性能。本文将深入探讨Java线程池的工作原理、应用场景以及优化策略,帮助读者更好地理解和应用线程池。
|
18小时前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
6 0
|
1天前
|
Java
并发编程之线程池的应用以及一些小细节的详细解析
并发编程之线程池的应用以及一些小细节的详细解析
11 0
|
10天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
11天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
17 1
探秘jstack:解决Java应用线程问题的利器
|
21天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【4月更文挑战第2天】本文将深入探讨Java并发编程中的重要组件——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过本文,你将能够更好地理解和使用线程池,提高你的Java并发编程能力。

热门文章

最新文章