2个线程如何同时锁定同一个对象?

时间:2018-02-26 02:31:53

标签: java multithreading debugging runnable synchronized

我正在编写一个多线程程序来打印从1到n的数字。

我有2个帖子,其中有一个打印{√}号的跑步者。还有一个有一个打印import Foundation import CoreData class CoreDataStack { private let modelName: String init(modelName: String) { self.modelName = modelName } lazy var managedContext: NSManagedObjectContext = { return self.storeContainer.viewContext }() private lazy var storeContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: self.modelName) container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { print("Unresolved error \(error), \(error.userInfo)") } }) return container }() func saveContext() { guard managedContext.hasChanges else { return } do { try managedContext.save() } catch let error as NSError { print("Unresolved error \(error), \(error.userInfo)") } } } 号的跑步者的线程。

Odd

我已将调试点放在synchronized方法中。附加快照:

enter image description here 在第一个调用Even的线程之后,在调试选项卡中,它仍显示

while (true) { synchronized (ng) { while (ng.getData() % 2 == 1) { try { ng.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } ng.increment(); ng.notify(); }

您可以在快照中看到:

它表示2个主题:Thread-1和Thread-2拥有NumberGenerator对象。

2个线程如何同时锁定对象?

1 个答案:

答案 0 :(得分:2)

两个线程不可能同时保持相同的锁。这可能是由于两个线程在调试器中显示的数据之间交换锁。因此,例如,调试器将获取线程1的数据,然后线程1释放锁,然后线程2获取锁,然后调试器获取线程2的数据。这将使两个线程看起来都有锁定在同一时间。这个问题的答案解释得很好:Multiple threads hold the same lock?

但我同意Elliot,如果你只想打印1到n的数字,那么for循环是可行的。但是如果你想学习线程是如何工作的,那么拥有两个线程可能是一个很好的练习

相关问题