我正在编写一个多线程程序来打印从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方法中。附加快照:
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个线程如何同时锁定对象?
答案 0 :(得分:2)
两个线程不可能同时保持相同的锁。这可能是由于两个线程在调试器中显示的数据之间交换锁。因此,例如,调试器将获取线程1的数据,然后线程1释放锁,然后线程2获取锁,然后调试器获取线程2的数据。这将使两个线程看起来都有锁定在同一时间。这个问题的答案解释得很好:Multiple threads hold the same lock?。
但我同意Elliot,如果你只想打印1到n的数字,那么for循环是可行的。但是如果你想学习线程是如何工作的,那么拥有两个线程可能是一个很好的练习