aşağıdaki ECMA-335 özellikleri durumları: bir kilit edinme (System.Threading.Monitor.Enter veya senkronize bir yöntem giren)Kilitleme Monitor.Enter ve Monitor.Exit blok
* dolaylı uçucu bir okuma yapar işlem ve bir kilidi serbest bırakma (System.Threading.Monitor.Exit veya bir senkronize yöntem bırakarak), dolaylı olarak bir uçucu yazma işlemi gerçekleştirecektir. (...)
bir kalıcı salt okuma öncesi CIL talimat dizisi okuma talimatı sonra meydana bellek herhangi bir referans için cereyan etmesi garanti edifmektedir yani anlam kazanır sahiptir. Uçucu bir yazma, semantiklerin salıverilmesi anlamına gelir, bu da yazımın, CIL talimat dizisindeki yazma talimatından önce herhangi bir hafıza referansından sonra gerçekleşeceğinin garantilenmesi anlamına gelir. *
Bu, derleyicilerin ifadeleri Monitor.Enter/Monitor.Exit bloklarından dışarı taşıyamayacağı anlamına gelir, ancak diğer ifadelerin bloğa taşınması yasaktır. Belki de, başka bir Monitor.Enter bile blok içine taşınmış olabilir (uçucu yazma tarafından izlenen bir uçucu okuma olarak değiştirilebilir). Yani, aşağıdaki kod içerebilir:
class SomeClass
{
object _locker1 = new object();
object _locker2 = new object();
public void A()
{
Monitor.Enter(_locker1);
//Do something
Monitor.Enter(_locker2);
Monitor.Exit(_locker1);
//Do something
Monitor.Exit(_locker2);
}
public void B()
{
Monitor.Enter(_locker2);
//Do something
Monitor.Enter(_locker1);
Monitor.Exit(_locker2);
//Do something
Monitor.Exit(_locker1);
}
}
, muhtemelen kilitlenmeleri giden:
class SomeClass
{
object _locker1 = new object();
object _locker2 = new object();
public void A()
{
Monitor.Enter(_locker1);
//Do something
Monitor.Exit(_locker1);
Monitor.Enter(_locker2);
//Do something
Monitor.Exit(_locker2);
}
public void B()
{
Monitor.Enter(_locker2);
//Do something
Monitor.Exit(_locker2);
Monitor.Enter(_locker1);
//Do something
Monitor.Exit(_locker1);
}
}
, followig bir eşdeğerine dönüştürülebilir? Yoksa hiçbir şey eksik miyim?
İki farklı şey hakkında konuşuyorsunuz. İlgili olan, ne derleyici ne de jitter, metod çağrılarını yeniden sipariş edemez. –
Hmm ... ilginç bir soru. Yine de henüz argüman yeniden sıralama argümanını almaya hazırım. Demek istediğim, en iyi duruma getirme optimizasyonu * önleme optimizasyonundan önce. Spesifikasyonda bunu engelleyecek bir madde var mı? –