论坛首页 Java企业应用论坛

Graceful Java Programming 优雅Java编程 之 一个经典的线程锁

浏览 5866 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-26   最后修改:2009-02-06
功能:
1.实现跨客户端的多用户同步锁
2.实现多重嵌套的同步锁
说明:
      这是本人7年Java生涯以来最钟爱的一段Java代码,其结构简洁,设计优雅,充分显示了作者对Java多线程机制的领悟;更重要的它可以很轻量级的嵌入到任何类的任何方法的任何代码段,来实现该代码段的线程同步。实在是经典中的经典啊!
public class TransactionLock {
 //并发事务锁对象,根据lockOwner,判定相应线程能否获得事务锁
 private Thread lockOwner = null;
 
 //锁深度,在同一synchronized事务内,事务锁被获取的次数
 private int lockDeep = 0;
 
 
 public TransactionLock() {
  super();
 }
 public synchronized void getLock(){
  while(tryGetLock() == false){
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 
 private synchronized boolean tryGetLock(){
  boolean rtval = false;
  
  if(this.lockOwner == null){
   this.lockOwner = Thread.currentThread();
   this.lockDeep = 1;
   rtval = true;
  }else if(this.lockOwner == Thread.currentThread()){
   this.lockDeep += 1;
   rtval = true;
  }
  
  return rtval;
 }
 
 public synchronized void freeLock(){
  if(this.lockOwner == Thread.currentThread()){
   this.lockDeep -= 1;
   if(this.lockDeep == 0){
    this.lockOwner = null;
    this.notify();
   }
  }
 }
 
 public Thread getLockOwner(){
  return this.lockOwner;
 }
 
 public synchronized boolean hasLocked(){
  return (tryGetLock() == false);
 } 
 
}
   发表时间:2008-02-26  
确实比较精简。

以楼主7年的开发经验,是否读过 AbstractQueuedSynchronizer ?

它的代码利用了很多像CAS,非阻塞,双向链表等技巧,再对锁获取数量做一些限制,实现了 ReentrantLock, Semaphore, CountDownLatch, FutureTask等多线程工具.

个人感觉已经非常优秀。
0 请登录后投票
   发表时间:2008-02-27  
galaxystar 写道
确实比较精简。

以楼主7年的开发经验,是否读过 AbstractQueuedSynchronizer ?

它的代码利用了很多像CAS,非阻塞,双向链表等技巧,再对锁获取数量做一些限制,实现了 ReentrantLock, Semaphore, CountDownLatch, FutureTask等多线程工具.

个人感觉已经非常优秀。


实际上在的JDK5.0中提供的新的线程同步控制类和机制都足够应付大部分的开发使用啦,这里之所以发布这个代码,是想同大家分享一下Java的优雅气质,呵呵。至于开发7年的说法是来形容我对这段代码的钟爱哒,没有炫耀的意思。JavaEye上牛人多得是,天外天,人外人!言语不周,大家海涵!
0 请登录后投票
   发表时间:2008-02-27  
顺便说一下,这段代码是国外某大师作品,并非本人哒,在java1.2时代的杰作!
有时候从最基础的Java代码学习高级功能开发,能领悟到很多滴!
0 请登录后投票
   发表时间:2008-02-27  
写得很不错,不过如果从应用角度上来讲,JDK5.0引入的Concurrent包直接对操作系统底层操作,效率是最好的
0 请登录后投票
   发表时间:2008-02-27  
我觉得早期的jdk可以使用这些代码,有了Concurrent包之后就可以放弃它了。
0 请登录后投票
   发表时间:2008-02-28  
这段代码是Java Thread书上面的例子程序
0 请登录后投票
   发表时间:2008-12-05  

这段代码确实不错,不知道ReentrantLock是否也是这种原理进行实现。
0 请登录后投票
   发表时间:2008-12-05  
drbeckham 写道

写得很不错,不过如果从应用角度上来讲,JDK5.0引入的Concurrent包直接对操作系统底层操作,效率是最好的


Concurrent只是普通的java类,要说更直接底层,还是要数synchronized,JVM对它有直接的优化。
0 请登录后投票
   发表时间:2008-12-07   最后修改:2008-12-07
Concurrent里头的一些类.如果cpu指令支持,会直接调用cpu指令.估计lock也有用到这些指令
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics