解锁锁定的同步块的可靠方法

问题描述 投票:0回答:1

有时系统在同步块上引发严重错误,并且有一个try-catch,理论上应该启动线程“解锁”过程,但这不会被触发。因此,我可以得出结论,这在系统内不被视为异常。有合理的方式处理上述锁吗?

请考虑board.jsp中的以下代码:

account = Account.get(accountID);
Object synch=account;

if(synch == null) {
    %>No account.<%
    return;
}
try {
    synchronized(synch) {
        ....
    }
} catch (Exception e) {
    ....
} finally {
    ....
}

示例转储

SEVERE: Scheduled tasks not running!
Apr 07, 2020 4:59:36 PM ExecLauncher:execLauncher run
SEVERE: ---------------------
Thread is: "http-bio-8080-exec-18" Id=122 BLOCKED on com.main.Account@5a0b8133 owned by "http-bio-8080-exec-7" Id=38
        at org.apache.jsp.realtime.board_jsp._jspService(board_jsp.java:192)
        -  blocked on com.main.Account@5a0b8133
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

感谢您的光临:)

java multithreading jsp tomcat synchronized
1个回答
0
投票

基于给出的很少,我有这些观察结果:

首先,隐式锁(使用同步)的主要优点是,当线程离开同步块或方法时,该锁将自动释放。因此,我认为这里不释放锁是不可能的。

其次,我对帐户同步的使用并不十分自信。这是推测性的,因为我不知道Account.get在做什么,但是要使此锁定方案起作用,则对于使用给定ID的每次调用,该方法都必须返回完全相同的对象实例。如果Account.get有使用的缓存,并且应用程序未分布在不同的服务器上,则可以正常工作,直到缓存过期(或其他使正在启用的帐户失效的内容)为止。那么您可能是SOL。

我的建议是使用行级锁定而不是当前方案在数据库层进行锁定。

© www.soinside.com 2019 - 2024. All rights reserved.