`
linliangyi2007
  • 浏览: 1012534 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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

阅读更多
功能:
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);
 } 
 
}
分享到:
评论
14 楼 linliangyi2007 2008-12-08  
repsihWDX 写道
个人觉得,这样处理exception有点不负责任。尤其interruptedException本身产出是为了取消wait状态或sleep状态cancel机制。不知道抛出好了。。这样做如果当前wait线程被interrupt的话,有肯呢个人家是为了做点什么其他的活动比如重试或改变计算请求重试。哪怕是log输出或什么都不做。既然这个类处理不了,那决定权就不在这个类么。冒泡出去好些:)


3Q
13 楼 repsihWDX 2008-12-08  
个人觉得,这样处理exception有点不负责任。尤其interruptedException本身产出是为了取消wait状态或sleep状态cancel机制。不知道抛出好了。。这样做如果当前wait线程被interrupt的话,有肯呢个人家是为了做点什么其他的活动比如重试或改变计算请求重试。哪怕是log输出或什么都不做。既然这个类处理不了,那决定权就不在这个类么。冒泡出去好些:)
12 楼 linliangyi2007 2008-12-08  
repsihWDX 写道

# catch (InterruptedException e) {  #     e.printStackTrace();  #    }  优雅?


请教兄台通常对这样的异常是如何处理的呢?!
PS:这段代码不是我写的哈,从某本书上看来了,觉得好就分享了
11 楼 repsihWDX 2008-12-07  
# catch (InterruptedException e) { 
#     e.printStackTrace(); 
#    } 

优雅?
10 楼 wmuu 2008-12-07  
Concurrent里头的一些类.如果cpu指令支持,会直接调用cpu指令.估计lock也有用到这些指令
9 楼 jovil 2008-12-05  
drbeckham 写道

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


Concurrent只是普通的java类,要说更直接底层,还是要数synchronized,JVM对它有直接的优化。
8 楼 jovil 2008-12-05  

这段代码确实不错,不知道ReentrantLock是否也是这种原理进行实现。
7 楼 dihin 2008-02-28  
这段代码是Java Thread书上面的例子程序
6 楼 tinywind 2008-02-27  
我觉得早期的jdk可以使用这些代码,有了Concurrent包之后就可以放弃它了。
5 楼 drbeckham 2008-02-27  
写得很不错,不过如果从应用角度上来讲,JDK5.0引入的Concurrent包直接对操作系统底层操作,效率是最好的
4 楼 skydream 2008-02-27  
好好学习一吧,感谢楼主分享!
3 楼 linliangyi2007 2008-02-27  
顺便说一下,这段代码是国外某大师作品,并非本人哒,在java1.2时代的杰作!
有时候从最基础的Java代码学习高级功能开发,能领悟到很多滴!
2 楼 linliangyi2007 2008-02-27  
galaxystar 写道
确实比较精简。

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

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

个人感觉已经非常优秀。


实际上在的JDK5.0中提供的新的线程同步控制类和机制都足够应付大部分的开发使用啦,这里之所以发布这个代码,是想同大家分享一下Java的优雅气质,呵呵。至于开发7年的说法是来形容我对这段代码的钟爱哒,没有炫耀的意思。JavaEye上牛人多得是,天外天,人外人!言语不周,大家海涵!
1 楼 galaxystar 2008-02-26  
确实比较精简。

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

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

个人感觉已经非常优秀。

相关推荐

    graceful-fs-fs模块的一个替代拥有各种改进

    优雅的fs(graceful-fs)是Node.js生态系统中一个重要的模块,它作为原生fs模块的一个增强版本,提供了一系列的改进和优化,旨在提高文件系统的操作性能和稳定性。在Node.js开发过程中,文件系统操作是不可或缺的一...

    Go-graceful优雅的重载http服务器零宕机时间兼容systemdsupervisor

    `Go-graceful`是一个专门设计用于处理HTTP服务器的优雅重启和关闭的Go库。它允许你在不中断现有连接的情况下进行服务的更新或重启,这对于提供不间断服务的在线应用至关重要。零宕机时间的实现是通过保持旧服务器...

    Graceful Graph

    优雅图(Graceful Graph)是图论中的一个概念,它源于数学和计算机科学,特别是网络流和图遍历的问题。这个概念是由美国数学家Edward G. Kolaitis在1970年代提出的,目的是研究图的标号特性。在英特尔线程挑战赛3月...

    前端开源库-graceful-readlink

    优雅的前端开源库——`graceful-readlink`是一个针对`fs.readlink`进行优化的模块,主要用于解决Node.js在处理符号链接时可能出现的问题。在Node.js原生的`fs`模块中,`fs.readlink`函数用于读取符号链接(symbolic ...

    Laravel开发-graceful-cache

    `graceful-cache`是一个针对Laravel的缓存存储库的包装器,其目标是提供一种更加优雅、灵活的方式来管理你的应用缓存。在这个项目中,开发者可以更好地控制缓存的生命周期,提高应用的效率。 `graceful-cache`的...

    前端开源库-graceful-ncp

    `graceful-ncp`是一个专门为前端开发者设计的开源库,它实现了优雅的、异步的文件和目录的递归复制功能。这个库的核心目标是提供一种更稳定、更易用的方式来处理文件系统操作,特别是在处理大量文件或复杂目录结构时...

    前端开源库-graceful-kill

    "优雅地杀死"一个进程意味着按照预定的顺序和方式结束进程,而不是简单地强制停止,这有助于避免数据丢失和系统不稳定。graceful-kill库就是为了解决这个问题,它允许开发者安全地关闭子进程,确保所有待处理的任务...

    java程序发布成window后服台

    本文将详细讲解如何将一个Java程序打包并发布为Windows后台服务,同时提供一个具体的示例。 首先,我们需要理解Java服务的概念。在Windows操作系统中,服务是一种在没有用户界面的情况下运行的特殊类型的应用程序,...

    Scalable IO in Java -Doug Lea

    在Java中实现可扩展的IO操作是一个复杂且重要的主题,尤其是对于需要处理大量并发连接的服务器应用程序。本文将介绍Scalable IO in Java一书,其作者是Doug Lea,他同时也是Java并发编程领域的权威。在这本书中,Lea...

    Scalable IO in Java.pdf

    文件标题和描述提到了Java中的可伸缩IO(Scalable IO in Java),文档的标签为“nio”,即Java的非阻塞IO(New I/O),这是Java在1.4版本中引入的一个新的包java.nio,为IO提供了一种新的方式。 首先,文档提到了...

    graceful:写优雅服务的库

    控制优雅的应用程序 优雅的应用程序可以用信号来控制。 主进程支持以下信号 期限/INT 快速关机 放弃正常关机 合肥 重启工人 启动新的工作进程 优雅关闭旧的工作进程 USR2 升级可执行文件(启动新的主进程和工作进程...

    Laravel开发-graceful-laravel-workers

    2. **Worker的生命周期**:一个工作进程一旦启动,就会持续运行,不断从队列中拉取任务。当收到停止信号时,标准的工作进程会立即停止,可能导致正在处理的任务中断。 3. **优雅关闭(Graceful Shutdown)**:在...

    express-graceful-exit, 为了得到零停机,优雅地退出 Express.zip

    express-graceful-exit, 为了得到零停机,优雅地退出 Express express-graceful-exit具有零停机时间的组件为 node.js 使用 Express 部署。 它是为 3. X, 开发的,因此它可能需要与 Express 2.x 兼容。这个模块最初是...

    javaAJAX无刷技术

    在实际开发中,为了兼容各种浏览器和提升用户体验,开发者通常会结合使用AJAX和其他技术,例如使用渐进增强(Progressive Enhancement)或优雅降级(Graceful Degradation)策略,确保即使在JavaScript禁用或不支持...

    RFC8538 Notification Message Support for BGP Graceful Restart

    1. **发送Hard Reset**:当一个BGP发言人决定不执行优雅重启而是立即关闭会话并重新建立新会话时,它可以发送一个包含特定子代码的BGP Cease NOTIFICATION消息,表明这是一个硬重启。 2. **接收Hard Reset**:接收端...

    BGP Graceful Restart

    当所有路由发送完毕后,会发送一个空的Update作为End-of-RIB Marker,表明已发送所有路由信息,这是GR正常结束的一个条件。 2.4 Graceful Restart Capability: GR Capability是BGP Open报文中新增的一项能力,用于...

    Functional Programming in C++

    Mastering the functional style of programming can help you tackle the demands of modern apps and will lead to simpler expression of complex program logic, graceful error handling, and elegant ...

    前端开源库-graceful-fs-extra

    `graceful-fs-extra`是一个针对Node.js环境的`fs`模块扩展库,它在原生`fs`模块的基础上增加了一些实用功能,并提供了更优雅的错误处理机制,使得文件操作更加高效和稳定。本文将深入探讨`graceful-fs-extra`库的...

    springboot优雅停机实战demo

    在Spring Boot应用中,优雅停机(Graceful Shutdown)是一个重要的实践,特别是在生产环境中,它确保应用程序在停止服务之前能够完成正在进行的任务,清理资源,并且不会立即拒绝新的请求。这有助于避免数据丢失、...

Global site tag (gtag.js) - Google Analytics