Tag: 锁定

通过ReentrantLock访问的字段是否需要volatile关键字?

我的问题是指使用ReentrantLock是否保证字段的可见性与synchronized关键字提供的方面相同。 例如,在下面的类A中 ,字段sharedData不需要声明为volatile,因为使用了synchronized关键字。 class A { private double sharedData; public synchronized void method() { double temp = sharedData; temp *= 2.5; sharedData = temp + 1; } } 但是,对于使用ReentrantLock的下一个示例,字段上的volatile关键字是否必要? class B { private final ReentrantLock lock = new ReentrantLock(); private volatile double sharedData; public void method() { lock.lock(); try { double temp = sharedData; temp […]

将synchronized()与ReentrantLock.lock()混合

在Java中, ReentrantLock.lock()和ReetrantLock.unlock()使用与ReetrantLock.unlock()相同的锁定机制? 我的猜测是“不”,但我希望是错的。 例: 想象一下,线程1和线程2都可以访问: ReentrantLock lock = new ReentrantLock(); 线程1运行: synchronized (lock) { // blah } 线程2运行: lock.lock(); try { // blah } finally { lock.unlock(); } 假设线程1首先到达其部分,然后在线程1完成之前到达线程2:线程2将等待线程1离开synchronized()块,还是继续运行?

多个Java线程似乎锁定了同一个监视器?

在Java threaddump中,我发现了以下内容: “TP-Processor184” daemon prio=10 tid=0x00007f2a7c056800 nid=0x47e7 waiting for monitor entry [0x00007f2a21278000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725) – locked (a org.apache.jackrabbit.core.state.SharedItemStateManager) at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257) “TP-Processor137” daemon prio=10 tid=0x00007f2a7c00f800 nid=0x4131 waiting for monitor entry [0x00007f2a1ace7000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.jackrabbit.core.state.SharedItemStateManager.getNonVirtualItemState(SharedItemStateManager.java:1725) – locked (a org.apache.jackrabbit.core.state.SharedItemStateManager) at org.apache.jackrabbit.core.state.SharedItemStateManager.getItemState(SharedItemStateManager.java:257) 这里的重点是两个线程都锁定了监视器 (无论它们现在正在等待两个不同的其他监视器)。 在查看Thread Dump Analyzer时,如果选择了该监视器,它实际上会在底部显示“Threads locking monitor:2”,并且“2 […]

MySQL InnoDB挂起等待表级锁

我有一个很大的生产网络应用程序(Glassfish 3.1 + MySQL 5.5)。 所有表都是InnoDB。 每隔几天应用程序完全挂起。 SHOW FULL PROCESSLIST在不同的表上显示了许多简单的插入或更新查询,但都具有状态 等待表级锁定 例子: update user set user.hasnewmessages = NAME_CONST(‘in_flag’,_binary’\0′ COLLATE ‘binary’) where user.id = NAME_CONST(‘in_uid’,66381) insert into exchanges_itempacks set packid = NAME_CONST(‘in_packId’,332149), type = NAME_CONST(‘in_type’,1), itemid = NAME_CONST(‘in_itemId’,23710872) 具有最长“时间”的查询也在等待表级锁定。 请帮助弄清楚为什么MySQL试图获得级别锁定以及可以锁定所有这些表的内容。 关于InnoDB锁定的所有文章都说如果不强制它,这个引擎就不使用表锁定。 我的my.cnf有这个: innodb_flush_log_at_trx_commit = 0 innodb_support_xa = 0 innodb_locks_unsafe_for_binlog = 1 innodb_autoinc_lock_mode=2 二进制日志已关闭。 我根本没有“LOCK TABLES”或其他显式锁定命令。 交易是READ_UNCOMMITED […]

Spring @Transactional和Hibernate @LockMode注释是如何相关的

我想知道交易和锁之间的关系。 更具体地说,Spring的@Transactional与Hibernate的LockMode有什么关系。 https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html 。 http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html 如果我在创建会话对象时没有指定任何锁定,并将@Transactional与readOnly一起使用为false ,我是否使用悲观的Concurrenct Control。 如果有人能告诉我(乐观/悲观)并发控制和交易之间的关系,那将是一个很大的帮助。 谢谢Vivek

跨群集共享Java同步块,还是使用全局锁?

我有一些代码,我只想允许一个线程访问。 我知道如何使用synchronized块或方法完成此操作,但这是否适用于集群环境? 目标环境是WebSphere 6.0,在集群中有2个节点。 我觉得synchronized不起作用,因为每个节点上的每个应用程序实例都有自己的JVM,对吧? 我在这里尝试做的是在系统启动时对数据库记录执行一些更新。 它将查找比代码版本更旧的任何数据库记录,并执行特定任务以更新它们。 我只希望一个节点执行这些升级,因为我想确保每个工作项只升级一次,并且这些升级的性能不是一个大问题,因为它只发生在应用程序启动时,它只是真正做任何事情自上次启动以来代码更改的时间。 数据库是DB2v9,我通过JNDI直接访问它(没有ORM层)。 有人建议全球锁定可能是这里的方式,但我不知道如何做到这一点。 有没有人在这个舞台上有任何指针? 谢谢!

灵活的锁定方式(选择性锁定)

我需要解决具有不同内存位置的相等对象的情况(由于multithreading,它发生在REST请求中)。 因此作为部分解决方案,我实施了服务。 我在这里分享最重要的部分: private Map lockHolder = new HashMap(); void unLock(T monitorMarker) { synchronized (lockHolder) { ReentrantLock lock = lockHolder.get(monitorMarker); if (lock == null || lock.getHoldCount() == 0) { return; } lock.unlock(); if (lock.getHoldCount() == 0) { lockHolder.remove(monitorMarker); } } } ReentrantLock getLockForCalendar(T monitorMarker) { synchronized(monitorMarker) { ReentrantLock lock = lockHolder.get(monitorMarker); if (lock == null) […]

为什么以下代码导致死锁

我有以下课程 public class LockTester implements Runnable{ private static Locker locker = new Locker(); public static void main(String[] args){ for(int i=0;i<10;i++){ Thread t = new Thread(new LockTester()); t.start(); } } public void run(){ for(int i=0;i<1000;i++){ locker.unlockFirst();//note unlocking here locker.lockFirst(); locker.lockSecond(); locker.unlockSecond(); locker.unlockFirst(); } } } 和洛克class public class Locker{ private Lock lock1 = new ReentrantLock(); private […]

使用内部锁进入块

我没有看到下面的代码如何产生看起来违反对象锁定义的输出。 当然只允许一个线程打印“获取的锁定”消息,但他们都这样做? class InterruptThreadGroup { public static void main(String[] args) { Object lock = new Object(); MyThread mt1 = new MyThread(lock); MyThread mt2 = new MyThread(lock); mt1.setName(“A”); mt1.start(); mt2.setName(“B”); mt2.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { } // Thread.currentThread().getThreadGroup().interrupt(); } } class MyThread extends Thread { private Object lock; public MyThread(Object l) { […]

使用java API锁定和解锁文件

我们的一个客户正在使用一些新的安全软件,有时会锁定我们软件创建的一些.class文件。 当发生这种情况时,这会给他们带来一些令人讨厌的问题,并且我正在尝试研究我们可以添加到我们的error handling中以解决此问题的解决方法。 我想知道java api中是否有任何调用可用于检测文件是否被锁定,如果是,则将其解锁。