浏览 881 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-02-26 关键字: java thread 同步锁
功能:
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);
}
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-02-26
确实比较精简。
以楼主7年的开发经验,是否读过 AbstractQueuedSynchronizer ? 它的代码利用了很多像CAS,非阻塞,双向链表等技巧,再对锁获取数量做一些限制,实现了 ReentrantLock, Semaphore, CountDownLatch, FutureTask等多线程工具. 个人感觉已经非常优秀。 |
|
| 返回顶楼 | |
|
时间:2008-02-27
galaxystar 写道 确实比较精简。
以楼主7年的开发经验,是否读过 AbstractQueuedSynchronizer ? 它的代码利用了很多像CAS,非阻塞,双向链表等技巧,再对锁获取数量做一些限制,实现了 ReentrantLock, Semaphore, CountDownLatch, FutureTask等多线程工具. 个人感觉已经非常优秀。 实际上在的JDK5.0中提供的新的线程同步控制类和机制都足够应付大部分的开发使用啦,这里之所以发布这个代码,是想同大家分享一下Java的优雅气质,呵呵。至于开发7年的说法是来形容我对这段代码的钟爱哒,没有炫耀的意思。JavaEye上牛人多得是,天外天,人外人!言语不周,大家海涵! |
|
| 返回顶楼 | |
|
时间:2008-02-27
顺便说一下,这段代码是国外某大师作品,并非本人哒,在java1.2时代的杰作!
有时候从最基础的Java代码学习高级功能开发,能领悟到很多滴! |
|
| 返回顶楼 | |
|
时间:2008-02-27
写得很不错,不过如果从应用角度上来讲,JDK5.0引入的Concurrent包直接对操作系统底层操作,效率是最好的
|
|
| 返回顶楼 | |
|
时间:2008-02-27
我觉得早期的jdk可以使用这些代码,有了Concurrent包之后就可以放弃它了。
|
|
| 返回顶楼 | |
|
时间:2008-02-28
这段代码是Java Thread书上面的例子程序
|
|
| 返回顶楼 | |








