Pertanyaan Statis versus objek kunci non-statis dalam blok tersinkronisasi


Mencoba memvisualisasikan dan mengerti sinkronisasi.

  1. Apa perbedaan antara menggunakan objek kunci statis (kode A)

32
2017-08-21 11:58


asal


Jawaban:


Perbedaannya sederhana: jika objek yang dikunci berada dalam a static bidang, lalu semua contoh MyClass* akan Bagikan kunci itu (yaitu tidak ada dua objek yang akan dapat mengunci objek itu pada saat yang sama).

Jika bidang non-statis, maka setiap instance akan memiliki kunci sendiri, jadi hanya panggilan dari metode pada objek yang sama akan mengunci satu sama lain.

Saat Anda menggunakan objek kunci statis:

  • utas 1 panggilan o1.foo()
  • utas 2 panggilan o1.foo(), harus menunggu utas 1 selesai
  • utas 3 panggilan o2.foo(), akan juga harus menunggu utas 1 (dan mungkin 2) selesai

Saat Anda menggunakan objek kunci non-statis:

  • utas 1 panggilan o1.foo()
  • utas 2 panggilan o1.foo(), harus menunggu utas 1 selesai
  • utas 3 panggilan o2.foo(), itu bisa terus berlanjut, tidak memusingkan benang 1 dan 2

Yang mana yang Anda perlukan tergantung pada jenis data apa yang Anda coba melindungi dengan blok tersinkronisasi Anda.

Sebagai aturan praktis, Anda ingin objek-kunci memiliki yang sama static-ness dari nilai yang dioperasionalkan. Jadi jika Anda memanipulasi nilai-nilai non-statis hanya, Anda akan menginginkan objek kunci non-statis. Jika Anda memanipulasi nilai-nilai statis hanya, Anda akan menginginkan objek kunci statis.

Ketika Anda memanipulasi statis dan non-statis nilai-nilai, maka itu akan menjadi rumit. Itu mudah caranya adalah dengan hanya menggunakan objek kunci statis, tapi itu mungkin meningkatkan ukuran blok tersinkronisasi lebih dari benar-benar diperlukan dan mungkin perlu lebih banyak pertentangan kunci dari yang diinginkan. Dalam kasus-kasus itu Anda mungkin memerlukan kombinasi objek kunci statis dan non-statis.

Dalam kasus khusus Anda, Anda menggunakan kunci dalam konstruktor, yang hanya akan dieksekusi sekali per instance, sehingga objek kunci non-statis tidak masuk akal di sini.


45
2017-08-21 12:04