Apakah ada objek Mutex di java atau cara membuatnya? Saya bertanya karena objek Semaphore yang diinisialisasi dengan 1 izin tidak membantu saya. Pikirkan kasus ini:
try {
semaphore.acquire();
//do stuff
semaphore.release();
} catch (Exception e) {
semaphore.release();
}
jika pengecualian terjadi pada perolehan pertama, rilis di blok catch akan meningkatkan izin, dan semaphore tidak lagi menjadi semaphore biner.
Akankah cara yang benar?
try {
semaphore.acquire();
//do stuff
} catch (Exception e) {
//exception stuff
} finally {
semaphore.release();
}
Akankah kode di atas memastikan bahwa semaphore akan menjadi biner?
Jawaban:
Lihat halaman ini: http://www.oracle.com/technetwork/articles/javase/index-140767.html
Ini memiliki pola yang sedikit berbeda yang (menurut saya) apa yang Anda cari:
Dalam penggunaan ini, Anda hanya menelepon
release()
setelah berhasilacquire()
sumber
Objek apa pun di Java dapat digunakan sebagai kunci menggunakan
synchronized
blok. Ini juga akan secara otomatis menangani pelepasan kunci ketika pengecualian terjadi.Anda dapat membaca lebih lanjut tentang ini di sini: Kunci Intrinsik dan Sinkronisasi
sumber
synchronized
, Anda akan melihat mana yang lebih mudah dibaca dan tidak terlalu rawan kesalahan.transaction.begin(); transaction.commit()
.).someObject.wait(timeout)
dansomeObject.notify()
saat Anda melihat kode jawaban ini.sumber
"Lock implementations provide more extensive locking operations than can be obtained using synchronized methods and statements."
, dari: docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/... ... meskipun Anda ada benarnya. Jawaban Argv tidak menggambarkan atau menjelaskan operasi ini.private final ReentrantLock _mutex = ...
, Anda dapat menggunakan getHoldCount () untuk mengembalikan jumlah utas yang dikunci ulang. (Anda dapat menerapkan aCondition
untuk mencegah hal ini. Lihat API .)Tidak ada yang secara jelas menyebutkan ini, tetapi pola semacam ini biasanya tidak cocok untuk semaphore. Alasannya adalah bahwa utas apa pun dapat melepaskan semaphore, tetapi Anda biasanya hanya ingin utas pemilik yang awalnya terkunci dapat membuka kunci . Untuk kasus penggunaan ini, di Java, kami biasanya menggunakan ReentrantLocks, yang dapat dibuat seperti ini:
Dan pola desain penggunaan yang biasa adalah:
Berikut adalah contoh dalam kode sumber java di mana Anda dapat melihat pola ini beraksi.
Kunci reentrant memiliki manfaat tambahan untuk mendukung keadilan.
Gunakan semaphore hanya jika Anda membutuhkan semantik non-kepemilikan-rilis.
sumber
count=1
bukanlah kunci pengecualian timbal balik.lock
misalnya,ReentrantLock
amutex
? Saya tidak yakin mengapamutex
danbinary semaphore
dianggap sebagai entitas yang sama.Semaphore
dapat dilepaskan oleh utas apa pun, jadi itu mungkin tidak menjamin penjagaancritical section
. Ada pemikiran?Saya pikir Anda harus mencoba dengan:
Sedangkan inisialisasi Semaphore:
Dan di
Runnable Implementation
sumber
Kesalahan dalam posting asli adalah panggilan gain () yang diatur di dalam loop percobaan. Berikut adalah pendekatan yang benar untuk menggunakan semaphore "biner" (Mutex):
sumber
Untuk memastikan bahwa a
Semaphore
adalah biner, Anda hanya perlu memastikan bahwa Anda memasukkan jumlah izin sebagai 1 saat membuat semaphore. The Javadocs memiliki sedikit lebih penjelasan.sumber
Setiap kunci objek sedikit berbeda dari desain Mutex / Semaphore. Misalnya, tidak ada cara untuk mengimplementasikan melintasi node tertaut dengan benar dengan melepaskan kunci node sebelumnya dan menangkap yang berikutnya. Tetapi dengan mutex mudah diimplementasikan:
Saat ini, tidak ada kelas seperti itu di
java.util.concurrent
, tetapi Anda dapat menemukan implementasi Mutext di sini Mutex.java . Adapun pustaka standar, Semaphore menyediakan semua fungsi ini dan banyak lagi.sumber