`
milk_36
  • 浏览: 121422 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

重复使用同一对象锁问题!

阅读更多

通常由于某些业务需要对并发进行处理,所以会加锁如:

Lock lock = new ReentrantLock();

 最近刚好出现了这样一个问题,为了控制并发的影响在很多业务逻辑中加入lock,但是由于业务之间的关联性,尽然出现重复使用一个锁对象。

出现类似这样的代码结果:

static Lock lock = new ReentrantLock();

	public static void lock() {
		try {
			lock.lock();			
                           lock();
                       .....dosomething
		} finally {
			lock.unlock();
		}
	}

 把工作线程池的资源都耗尽了,所有的线程状态都变成 waiting!

也不会有什么异常信息出来,但是通过对线程堆栈信息的查看:

 

Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
				for (Thread t : map.keySet()) {
					System.out.println( t.getName() + ":" + t.getState().name());
					
					for (StackTraceElement e : t.getStackTrace()) {
						System.out.println(e.getClassName() + "." + e.getMethodName());
					}
					// }
				}

 就会有很多这样的信息:

Thread-2:WAITING
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)
java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
****.Test1.lock(Test1.java:133)
 

所有相关的工作线程都变成了waiting状态,到最后应用也没用宕,但是就是业务都等在那里了!-_-!

分享到:
评论

相关推荐

    多线程使用同一数组测试

    例如,在VB.NET中,可以将数组作为锁对象,确保同一时间只有一个线程能够访问它。 ```vbnet SyncLock myArray ' 这里进行数组操作 End SyncLock ``` 2. **线程局部存储(Thread Local Storage)**:如果可能,...

    [PHP] 基于redis的分布式锁防止高并发重复请求.docx

    * 可重入性:同一对象(如线程、类)可以重复、递归调用该锁而不发生死锁; * 可阻塞:在没有获得锁之前,只能阻塞等待直至获得锁; * 高可用:哪怕发生程序故障、机器损坏,锁仍然能够得到被获取、被释放; * 高...

    Asp.net中实现同一用户名不能同时登陆

    1. **锁机制**:由于`Application`对象是全局共享的,因此在对其进行修改之前需要使用`Application.Lock()`加锁,操作完成后使用`Application.UnLock()`解锁,防止多用户同时访问时发生冲突。 2. **性能考虑**:随着...

    SQlServer中的锁

    其中,锁是实现隔离性的一种手段,避免了多个事务同时操作同一数据可能导致的问题,如脏读、不可重复读和幻读。 在SQL Server中,可以锁定的资源包括但不限于表、页、行甚至更细粒度的对象。锁的粒度决定了锁的作用...

    Java对象池技术的原理及其实现

    对象池技术的核心思想在于通过缓存和共享机制来重复使用已创建的对象,而非每次都需要重新创建新的实例。这种方式显著降低了对象创建和销毁所带来的性能开销,同时也减少了内存的使用量。 #### 实现一个对象池的...

    正确使用多线程同步锁@synchronized()1

    这段代码并不会引起死锁,因为互斥锁是递归的,允许同一线程重复获取。 然而,值得注意的是,`@synchronized`的性能相对较慢,因为它涉及到了锁的获取和释放。在Objective-C的源码中,我们可以看到`objc_sync_enter...

    Oracle数据库的锁类型

    这种锁的目的是确保数据的一致性,避免脏读、不可重复读等问题。 #### 四、意向锁:提高锁检查效率 意向锁是在上层结点(如表级)做出的一种标记,用于指示下级结点(如行级)的锁类型。例如,当在行上加X锁时,会...

    易语言多线程禁止重复运行源码

    易语言还提供了`设置线程优先级`命令,可以调整线程的执行优先级,但应谨慎使用,以避免优先级反转或优先级继承问题。 6. **线程同步示例**: 以下是一个简单的易语言线程互斥锁示例: ``` .全局变量 锁状态, ...

    GBase 8s并行操作产生的问题

    不可重复读是指事务 A 在不同时刻读取同一对象,但结果不同,因为在这两次读取之间,事务 B 对对象进行了修改。在 GBase 8s 中,如果选择了较低的隔离级别,比如读已提交,就可能出现不可重复读的情况。要避免这种...

    SQL server锁的机制

    4. 意图锁(Intent Locks):意图锁是在更高级别的对象(如表或数据库)上设置的,表示事务对较低级别锁(如页或行)的意图。这减少了系统在确定锁兼容性时的开销,因为它可以从较高的层次快速判断是否可以授予锁。 ...

    易语言源码创建互斥对象禁止重复运行模块源码.rar

    在这个“易语言源码创建互斥对象禁止重复运行模块源码.rar”压缩包中,包含了用易语言编写的一段程序,其主要目的是实现程序的互斥运行,确保同一时间只有一个实例在运行。 互斥对象,也称为互斥锁,是多线程编程中...

    Oracle中使用锁进行并发控制

    这些锁的使用由数据库自动管理,但在某些场景下,开发者或DBA可能需要手动干预,以优化性能或解决特定问题。 #### 行级锁(Row Level Locking) 行级锁是最细粒度的锁,它仅锁定被事务修改的具体数据行。这使得多...

    java锁各种核心整理

    Java中的synchronized关键字就是悲观锁的典型应用,它可以用来修饰方法或代码块,保证在同一时刻只有一个线程可以执行同步代码,从而避免数据不一致的问题。除了synchronized外,Java的并发包(java.util.concurrent...

    易语言禁止程序重复运行

    "易语言禁止程序重复运行"是一个常见的需求,特别是在开发桌面应用程序时,我们通常希望同一时刻只有一个实例在运行,以防止资源冲突、数据混乱等问题。易语言,作为一款中文编程环境,为开发者提供了实现这一功能的...

    hibernate锁实验,以及解决方案

    通过以上知识点,我们可以更好地理解和解决在使用Hibernate时可能出现的锁相关问题,确保应用程序的稳定性和数据一致性。在实际开发中,应根据具体需求灵活运用各种锁机制,同时结合良好的编程习惯和设计原则,以...

    ASP.NET 2.0实现防止同一用户同时登陆

    - 考虑到并发问题,可以进一步优化代码逻辑,例如使用锁机制来确保多线程环境下的安全性。 #### 五、总结 通过上述方法,我们可以有效地实现在 ASP.NET 2.0 中防止同一用户同时登录的功能。这种方法不仅简单易行,...

    Tedu五阶段Redis分布式锁

    分布式锁的基本思想是在分布式系统中实现一种锁定机制,使得在多台机器上的进程可以共享同一把锁,并且在同一时刻只允许一个进程持有该锁。 1. **加锁**:客户端尝试获取锁,如果成功则继续执行操作;如果失败,则...

    (源码)基于Spring Boot和Redis的高并发电商秒杀系统.zip

    使用Redis缓存用户对象,解决分布式Session问题。 在MySQL数据表中添加唯一索引,防止同一用户重复下单。 使用行锁(悲观锁)解决高并发下的商品超卖问题。 Redis缓存商品库存信息,下单前先预扣减库存,减少对...

Global site tag (gtag.js) - Google Analytics