考虑以下代码:(注意:为了代码清晰起见,删除了所有尝试/捕获)
Object lock1 = new Object();
Object lock2 = new Object();
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
public void process() {
for (int i = 0; i < 1000; i++) {
methodA();
methodB();
}
}
public void methodA() {
synchronized (lock1) {
Thread.sleep(1); // mimics other operations
list1.add(random.nextInt(100));
}
}
public void methodB() {
synchronized (lock2) {
Thread.sleep(1); // mimics other operations
list2.add(random.nextInt(100));
}
}
现在假设创建了两个线程,它们都只需在它们的<code>run()</code>中调用<code>process()</code>方法。
假设当thread2尝试访问方法A()
时,锁已经被thread1获取了。据我所知,thread2将跳过同步锁,退出方法A()
,并启动方法B
(这就是拥有多个锁对象的意义)。但我的问题是thread2如何知道“返回”并完成方法A()
,而不是继续for
循环?
我知道情况是这样的,因为list1
和list2
最后都有2000个
,这意味着这两个线程都成功地完成了
我唯一的猜测是,当线程遇到一个被锁定的同步块时,它会将该块存储在队列(或其堆栈?)中并继续前进,直到该块再次空闲。
MethodA() 和 methodB() 是按顺序调用的,因此如果锁在 methodA() 中,直到并且除非锁被清除,否则线程将处于阻塞状态。
据我所知,thread2
将跳过同步锁,退出方法A(),并启动方法B
不,线程 2
将阻塞,即。停止执行,直到另一个线程完成方法 A
并释放锁。然后,它将恢复执行、获取锁并执行方法。
问题内容: 我是新手,所以请保持温柔。 因此,我已经在某些代码中使用互斥锁了几周了。我了解其背后的概念:锁定对特定资源的访问权限,与之交互(读或写),然后为其他人再次解锁。 我使用的互斥锁代码主要是复制粘贴调整。该代码可以运行,但是我仍在努力解决其内部问题。到目前为止,我一直在结构中使用互斥锁来锁定该结构。今天,我发现了这个例子,这使我完全不清楚互斥锁实际上是在锁定什么。以下是一段示例代码: 让我
在Android上有没有办法知道,如果运行我的代码的线程,是UI线程还是不是?在swing中,有来告诉我是否在UI线程上。安卓SDK里有什么功能让我知道这一点吗?
问题内容: 以下函数在其自己的线程中执行: 当执行到达该行时,将引发异常: 有谁知道如何锁定对象或函数以防止并发?我试图添加一个Lock对象: 和线 在功能开始时,但是没有用。 问题答案: 为了在一个对象上调用wait(),您必须在该对象上持有同步锁(尽管该锁实际上是在线程等待时释放的): 我必须承认,在这种情况下, 为什么 您要这样做让我感到困惑…
这是一个提倡的范例,即 wait() 应该在同步块内的 while 循环中调用。 我的问题是,waiting()线程如何获得锁? 考虑线程1首先运行并开始等待条件。它释放锁,线程2获得锁设置条件并通知线程1。现在线程1获得锁,检查条件并开始执行“做某事”。 我的问题是当线程1被通知它从time条件开始执行时,已同步(mon)的代码行永远不会再次执行,那么线程1如何获得锁?将锁还给线程1的内部动态是
问题内容: 假定下面的代码正在由10个线程执行。 为了便于说明,可以说线程是T1,T2,T3 .... T10。我的要求是,只要T1或T2或T3(即T1,T2或T3中的任何一个)正在等待获取锁,它的其他线程T4,T5,T6 .... T10都将无法获取。锁,即T1,T2和T3,应优先获得相对于其他线程的锁。 我想可以通过增加线程T1,T2和T3的优先级来完成 即这是伪代码 请注意,我想要一个适用于
问题内容: 我有一个名为的方法的对象,该方法启动三个线程。 每个线程执行完毕后,如何获得通知? 有没有办法知道一个(或全部)线程是否已完成或仍在执行? 问题答案: 你可以通过多种方式执行此操作: 在主线程中使用以阻塞方式等待每个线程完成,或者 以轮询方式(通常不鼓励使用)检查,等待每个线程完成,或者 非常规的,对于每个有问题的线程,调用来调用对象中的方法,并对每个线程进行编程以在完成时抛出未捕获的