Jika kode Anda berada dalam proses yang memiliki beberapa utas yang berjalan secara bersamaan, kode mungkin menjalankan kode secara bersamaan. Jika hasil setiap eksekusi sama dengan satu utas, dan nilai variabel lain sama seperti yang diharapkan, itu aman utas. Dengan kata lain, antarmuka yang disediakan oleh kelas atau program bersifat atom untuk utas atau beralih di antara beberapa utas tidak mengarah pada ambiguitas dalam hasil eksekusi antarmuka, yang berarti kita tidak perlu mempertimbangkan sinkronisasi. Masalah keamanan ulir disebabkan oleh variabel global dan statis. Jika setiap utas hanya memiliki operasi baca untuk variabel global dan variabel statis, tetapi tidak ada operasi tulis, secara umum, variabel global ini aman untuk utas; Jika beberapa utas melakukan operasi baca dan tulis pada variabel secara bersamaan, sinkronisasi utas umumnya diperlukan, jika tidak, hal itu dapat memengaruhi keamanan utas.
Tujuan kunci adalah untuk mencegah operasi bersamaan saat eksekusi multi-utas, dan objek dari jenis kunci referensi hanya memungkinkan satu utas beroperasi pada satu waktu di area terkunci.
Kunci hanya dapat mengunci satu variabel jenis referensi, yaitu mengunci alamat
Ada perbedaan antara hasil berlari dengan dan tanpa penguncian:
Setelah mengunci: nilai i akan menurun satu per satu, tidak akan ada lompatan, tidak ada output berulang, hingga nilai 0;
Tidak ada kunci: output nilai i akan melompat, menurun secara terputus-putus, dan mungkin juga memiliki output nilai -1;
Alasan: Setelah menambahkan kunci, hanya satu utas yang dapat mengeksekusi kode di area terkunci pada satu waktu, dan kedua utas dijalankan secara berurutan, sehingga tidak akan ada output yang terganggu. |