如果一个谷歌用于"区别notify()和之间notifyAll()",那么会弹出很多解释(将javadoc段落分开).这一切都归结为等待线程被唤醒的数量:一个进入notify()和全部进入notifyAll().
但是(如果我确实理解了这些方法之间的区别),总是只选择一个线程用于进一步的监视器获取; 在第一种情况下,由VM选择的一种情况,在第二种情况下由系统线程调度程序选择的一种情况.一般情况下,程序员都不知道它们的确切选择程序(在一般情况下).
那么notify()和notifyAll()之间的有用区别是什么?我错过了什么吗?
我理解livelock是什么,但我想知道是否有人有一个很好的基于代码的例子呢?以代码为基础,我并不是说"两个人试图在走廊里相互过去".如果我再读一遍,我会失去午餐.
在低级语言(C,C++或其他)中:我可以选择在拥有一堆互斥(如pthread给我或者本机系统库提供的内容)或者对象的单个互斥之间.
锁定互斥锁的效率如何?即可能有多少汇编指令,以及它们花了多少时间(在互斥锁解锁的情况下)?
互斥量需要多少钱?真的有很多互斥体是一个问题吗?或者我可以在代码中抛出尽可能多的互斥变量,因为我有int变量并且它并不重要?
(我不确定不同硬件之间有多大差异.如果有,我也想了解它们.但大多数情况下,我对常见的硬件感兴趣.)
关键是,通过使用许多互斥体,每个互斥体只覆盖对象的一部分而不是整个对象的单个互斥体,我可以安全地使用许多块.我想知道我应该走多远.即我应该尽可能地尝试保护任何可能的块,无论多么复杂和多少互斥量这意味着什么?
关于锁定的WebKits博客文章(2016)与此问题非常相关,并解释了自旋锁,自适应锁,futex等之间的差异.
我正在使用旋转锁来保护非常小的关键部分.争用情况非常罕见所以自旋锁是比常规的互斥体更合适.
我目前的代码如下,并假设x86和GCC:
volatile int exclusion = 0;
void lock() {
while (__sync_lock_test_and_set(&exclusion, 1)) {
// Do nothing. This GCC builtin instruction
// ensures memory barrier.
}
}
void unlock() {
__sync_synchronize(); // Memory barrier.
exclusion = 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道:
__sync_lock_release.我不是记忆障碍的专家,所以我不确定我是否可以使用它而不是__sync_synchronize.我不在乎在所有有关争.有可能是1,也许2其他线程试图每过一次锁自旋锁天.
我正在检查如何以安全模式从线程写入备忘录。问题是,当使用TThread.Synchronize它时,表单会冻结,而没有它,表单就可以正常工作。
这是冻结的代码:
procedure TestThread;
var
x : Integer;
begin
for x := 0 to 2 do
begin
TThread.CreateAnonymousThread(
procedure
begin
while True do
begin
TThread.Synchronize(TThread.CurrentThread, procedure
begin
//CritLock.Acquire;
try
Form1.Memo1.Lines.Add('Add to Memo ' + IntToStr(GetTickCount));
finally
//CritLock.Release;
end;
end);
end;
end).Start;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这里是不冻结的代码:
procedure TestThread;
var
x : Integer;
begin
for x := 0 to 2 do
begin
TThread.CreateAnonymousThread(
procedure
begin
while True do
begin
//CritLock.Acquire;
try
Form1.Memo1.Lines.Add('Add to Memo ' + IntToStr(GetTickCount));
finally
//CritLock.Release;
end;
end; …Run Code Online (Sandbox Code Playgroud)