Tag:

如何在java中实现类级别锁定?

我知道锁定概念与静态和非静态方法同步分别锁定类和实例。 我无法理解的是,如何实现class级锁定? 我的意思是,课程只是一个模板,没有任何物理意义。 那么,当我们说通过同步静态方法实现类级别锁定时会发生什么呢? 该类的所有对象是否被锁定或其他进程? 我可以通过搜索找到的是有类对象(Class.class)并且在此类对象上获取了锁。 但那个class级的所有实例也是如何锁定的呢?

如何检查是否有任何等待条件变量的线程?

我有条件变量名为cond。 如果有任何线程等待cond,是否有任何方法可以给我真或假? 我需要类似的东西:Boolean cond.isAwaitingSetEmpty() 感谢帮助

我如何有条件地锁定Java?

我一直在利用Java的synchronized块来使我的代码线程部分安全。 我正在将数据结构移植到通常可以使用synchronized块的java,但我并不总是知道如何以典型的Java方式使用它们。 以下是一个场景的示例: myMethod (Bool useLock) { if (useLock) { //locks the following section of code until unlocked. lockObject.lock(); } //do more stuff…. if (useLock) { //unlocks exclusive control of code. lockObject.unlock(); } } 我如何在Java中完成相同的操作? 在这段代码中,有时我想锁定,有时我不想,但我想要聪明一点,而不必编写相同代码的两个版本。 除了使用synchronized块之外,还有其他方法可以锁定Java吗?

Java中的多个对象锁?

锁定私有字段变量(而不是使用锁定对象)是安全/可接受的做法吗? 这样,我可以有不同的锁用于不同的目的。 示例如下: class Test { private Integer x = 0; private Integer y = 0; public void incrementX() { synchronized(x) { x++; } } public void decrementX() { synchronized(x) { x++; } } public void incrementY() { synchronized(y) { y++; } } public void decrementY() { synchronized(y) { y++; } } 或者我应该为每个想要锁定的私人会员拥有一个锁定对象? 例: class […]

如何避免嵌套同步和导致的死锁

我需要在一个function中锁定两个对象,并且当前代码如下所示; Object obj1 = …//get from somewhere Object obj2 = …//get from somewhere synchronized(obj1){ …//blah synchronized(obj2){ …//blah } } 正如你所看到的,如果另一个线程使用obj1运行这段代码并且两个反转,这是一个简单而直接的死锁配方。 有没有办法使用concurrency-utils锁来避免这种情况? 我正在考虑维护一个物体及其锁定的地图并validation它们是否可以使用,但似乎无法想出一种可以预测锁定顺序的干净方式。

ABA在无锁算法中

我理解ABA问题。 但是我无法理解的是:他们说在有自动垃圾收集的语言中它可能无法展示。 所以我的问题是: 自动垃圾收集如何防止ABA问题发生? 是否有可能在java中,如果可以,如何? 有可能防止这种情况发生吗?

我应该同步监听器通知吗?

我总是非常犹豫要把我的锁公开,让它们公开。 我总是试图将锁限制在我的实现中。 我相信,不这样做是一个僵局的秘诀。 我有以下课程: class SomeClass { protected ArrayList mListeners = new ArrayList(); protected void addListener(Listener listener) { synchronized (mListeners) { mListeners.add(listener); } } protected void removeListener(Listener listener) { synchronized (mListeners) { mListeners.remove(listener); } } … } 当SomeClass想要通知他的听众时,你会这样做: synchronized (mListeners) { for (Listener l : mListeners) { l.event(); } } 要么 Listener[] listeners = null; […]

LinkedBlockingQueue和ConcurrentLinkedQueue之间有什么不同?

我已经阅读了博客,但我不确定他的结论是否正确: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html#ixzz1seaiSLwp 他说: 从提供的性能结果可以看出,LinkedBlockingQueue实现了最佳的组合(添加和删除元素)性能结果,应该是实现生产者 – 消费者schenarios的头号候选者。 我想知道,如果我不在我的代码中使用锁,那么它不会更快吗? 那么为什么LinkedBlockingQueue比无锁队列(ConcurrentLinkedQueue)更快? 谢谢 !

在Java中,如何测试对象的监视器是否被锁定?

在Java中,如何测试对象的监视器是否被锁定? 换句话说,给定一个对象obj,是否有任何线程拥有obj的监视器? 我不关心哪个线程拥有显示器。 我需要测试的是,任何线程是否拥有给定对象的监视器。 由于当前线程以外的线程可能拥有监视器,因此Thread.holdsLock(obj)是不够的,因为它只检查当前线程。 我试图找到最简单的解决方案。 这不重复,因为: 我不能使用更高级别/更新的并发/锁定机制。 我不能使用Lock等。我必须使用低级/旧/传统货币/锁定机制,如synchronized,wait()等。 当监视器已解锁时,我并不是想找时间执行代码。 我试图在监视器被锁定时执行代码。 实际上,为了给出一点背景知识,我尝试启动的unit testing的这一部分运行两个线程,它们都需要锁定同一个对象。 因此,为了测试正确的并发处理。 我需要1.创建两个线程。 2.启动线程1. 3.一旦线程1拥有监视器,就挂起线程1. 4.启动线程2. 5.一旦线程2被线程1阻塞,挂起线程2. 6.恢复线程1。 7.加入线程1. 8.运行一些断言。 9.恢复线程2. 10.加入线程2. 11.运行一些断言。 我想弄清楚的是做#3的最佳方法,主要是确定线程1何时拥有监视器。

具有多个对象/锁的Java同步

我想知道是否有一个包或模型可以帮助我解决这个问题。 假设我有3个线程和一堆对象A,B,C,D,E,F T1需要锁A,B T2需要锁B,C,D T3需要锁E,F 在这种情况下,如果T1和T3同时运行就没问题。 此外,T2和T3可以同时运行。 但T1和T2不应该同时运行。 另外,请注意 线程可以获得任意数量的锁,而不仅仅是2.(我看到了一个优雅的解决方案来解决这个问题,但是我不能确定我可以在这里应用它。) 显然,我希望每个线程同时获取所有需要的锁以防止死锁。 如果有人可以指向我支持此用例的程序包,或解决此问题的一些代码片段,请告诉我。 非常感谢。