Tag: 锁定

使用JPA表独占锁定

是否可以以数据库无关的方式使用JPA专门锁定整个表(例如,不使用本机查询)? 到目前为止,我只看到EntityManager.lock(*)但这只锁定给定记录。

JVM如何确保只有一个线程可以获取对象的锁?

我们大多数人都知道,每当线程访问对象的同步块时,JVM就会将该对象的锁定提供给线程。 JVM如何确保只有一个线程可以访问对象的锁?

Java读写锁定要求,具有来自不同线程的锁定和释放

我试图找到一个不那么笨重的Java并发问题的解决方案。 问题的关键在于,当仍有工作线程处于活动状态时,我需要对块进行关闭调用,但关键的方面是每个工作任务都是异步生成和完成的,因此保持和释放必须由不同的线程完成。 一旦他们的工作完成,我需要他们以某种方式向关闭线程发送信号。 只是为了让事情更有趣,工作线程不能互相阻塞,所以我不确定信号量在这个特定实例中的应用。 我有一个解决方案,我认为安全地完成了这项工作,但是我对Java并发工具的不熟悉使我认为可能有一个更容易或更优雅的模式。 在这方面的任何帮助将不胜感激。 这是我到目前为止所做的,除了评论之外相当稀疏: final private ReentrantReadWriteLock shutdownLock = new ReentrantReadWriteLock(); volatile private int activeWorkerThreads; private boolean isShutdown; private void workerTask() { try { // Point A: Worker tasks mustn’t block each other. shutdownLock.readLock().lock(); // Point B: I only want worker tasks to continue if the shutdown signal // hasn’t already been […]

Java:除了它们所属的对象之外,同步方法是否锁定了什么?

现在,我不确定这是否是一个愚蠢的问题,如果是的话,请耐心等待。 对象上的锁是“递归的”,即如果两个对象在其字段中引用了第三个对象,并且一个线程正在其中一个上运行同步方法,那么任何其他线程是否可以访问第三个对象? // a and b are some objects that implement Runnable // they both reference the same third object a.ref = c; b.ref = c; // a is run in a thread and processes some data in a loop for a long time // the method the loop belongs to is declared synchronized threadA […]

从JPA级别选择更新跳过锁定

在我的应用程序 – 带JPA的Oracle(EclipseLink)中,我使用以下表达式来锁定某些表中的记录子集: select * from MY_TABLE where MY_CONDITIONS for update skip locked 我在本机查询中运行它,但我必须为所有必需的实体编写该查询。 有没有办法使用纯JPA跳过锁定的记录? 我可以实施自己的锁定政策吗? 我不介意更改JPA提供程序,但我想使用JPA API。

在运行时交换正在运行的jar

我正在构建一个更新系统,我需要能够在运行时替换正在运行的应用程序jar的引用jar。 但是,当尝试在jar上执行文件实用程序function(例如’setLastModified’)时,我在Windows上遇到文件锁定问题。 经过一些谷歌搜索我发现这个片段… 我在研究中发现,标准的ClassLoader实现一旦打开就永远不会关闭它。 它还只根据需要从jar文件中加载资源。 因此,在任何特定时间,jar文件中可能存在尚未加载到内存中的类。 显然,如果你从ClassLoader下删除jar文件,并且它试图在丢失的文件中找到一个资源,那么你至少会得到一个IOException。 有没有人提到有关这样做的信息,或解决这个问题? 谢谢。

Java内存模型:重新排序和并发锁定

java meomry模型要求同步在同一监视器上synchronize块对这些块中修改的变量强制执行之前的实现。 例: // in thread A synchronized( lock ) { x = true; } // in thread B synchronized( lock ) { System.out.println( x ); } 在这种情况下,只要线程A已经通过了synchronized -block,就可以保证线程B将看到x==true 。 现在我正在重写大量代码以使用java.util.concurrent更灵活(并且说更快)的锁,尤其是ReentrantReadWriteLock 。 所以这个例子看起来像这样: 编辑 :示例被打破,因为我错误地转换了代码,如matt b所示 。 修正如下: // in thread A lock.writeLock().lock(); { x = true; } lock.writeLock().unlock(); // in thread B lock.readLock().lock(); { […]

监视Java应用程序上的锁争用

我试图创建一个小的基准(在Groovy中),显示几个同步方法的高线程争用。 监控自愿上下文切换时应该出现高争用,而在Linux中,这可以通过“pidstat”来实现。 该计划如下: class Res { private int n; synchronized public void inc() { n++; def foo = [] for (int i = 0; i < 1000; ++i) foo << "hello" } synchronized public int getN() { return n; } } while (true) { Res res = new Res() int N = 100000 for (int […]

对于ReentrantLock,实际使用lockInterruptibly

你实际上对这个方法使用了什么lockInterruptibly ? 我已阅读API,但对我来说不是很清楚。 换句话说,有人可以表达吗?

这个(无锁)队列实现线程安全吗?

我正在尝试用Java创建一个无锁队列实现,主要用于个人学习。 队列应该是一般的,允许任意数量的读者和/或作者同时。 您能否回顾一下,并建议您找到的任何改进/问题? 谢谢。 import java.util.concurrent.atomic.AtomicReference; public class LockFreeQueue { private static class Node { E value; volatile Node next; Node(E value) { this.value = value; } } private AtomicReference<Node> head, tail; public LockFreeQueue() { // have both head and tail point to a dummy node Node dummyNode = new Node(null); head = new AtomicReference<Node>(dummyNode); […]