Menggunakan disegerakkan - 1

"Hai, Amigo!"

"Ya, saya di sini, saya di sini."

"Hari ini, saya akan memberitahu anda tentang menggunakan disegerakkan dalam amalan."

"Apabila program mempunyai banyak objek dan benang, ia sering berlaku bahawa berbilang benang berfungsi dengan objek yang sama secara serentak. Dengan berbuat demikian, benang mengganggu antara satu sama lain."

"Ya, saya sudah tahu ini."

"Jadi, katakan anda mempunyai objek yang diakses oleh berbilang benang. Anda boleh melakukan dua perkara untuk mengelakkan masalah."

"Yang pertama ialah menggunakan blok yang disegerakkan untuk membalut setiap lokasi di mana objek itu diakses. Tetapi pendekatan ini mungkin tidak berfungsi jika sesetengah pengaturcara menulis kod yang mengakses objek secara langsung, tanpa blok yang disegerakkan."

"Oleh itu, pendekatan kedua digunakan pada kebanyakan masa-menjadikan benang objek selamat." "Dengan kata lain, mekanisme yang disegerakkan dibina ke dalam objek itu sendiri: ia mengisytiharkan kaedahnya disegerakkan dan/atau membungkus kod di dalam kaedahnya dalam blok yang disegerakkan."

"Jadi mana-mana objek yang mungkin saya gunakan daripada berbilang benang, dan ini adalah hampir semua objek dalam program, saya perlu membuat thread-safe?"

"Secara umum, ya. Pada hakikatnya, tidak semua objek dalam program digunakan oleh benang yang berbeza, tetapi biasanya terdapat banyak. Jadi, apabila anda mula menulis kod untuk benang dan mengakses pelbagai objek daripadanya, maka dengan setiap panggilan kaedah anda harus bertanya kepada diri sendiri, «Adakah panggilan ini selamat?»"

"Selamat?"

"Selamat untuk benang, yang bermaksud ia boleh dipanggil dengan selamat daripada berbilang rangkaian."

"Berikut adalah beberapa contoh. Katakan anda mempunyai objek String yang diakses daripada benang yang berbeza. Seperti yang anda sepatutnya ingat, String tidak boleh diubah —seperti semua jenis primitif lain. Ini bermakna objek tidak berubah selepas ia dicipta . Ini bermakna mustahil untuk «memecahkan» objek sedemikian. Semua objek tidak berubah adalah selamat untuk benang."

"Nah, itu memudahkan urusan."

"Sekarang, andaikan anda memerlukan rentetan boleh ubah."

"Ya, saya masih ingat. Terdapat dua jenis rentetan sedemikian: StringBuffer dan StringBuilder. StringBuffer adalah seperti StringBuilder, tetapi semua kaedahnya disegerakkan. Adakah ia juga selamat untuk benang?"

"Ya. Jika anda perlu mengakses objek StringBuilder daripada berbilang benang, anda mesti menggantikannya dengan StringBuffer. Jika tidak, lambat laun benang itu akan menukarnya pada masa yang sama dan «mematahkan»nya."

"Bagaimana jika objek yang diakses daripada benang berbeza ialah objek kelas saya sendiri? Adakah saya perlu menambah disegerakkan pada kaedahnya dalam kes ini juga?"

"Ya. Sebaik-baiknya ikut peraturan ini: semua objek yang akan diakses daripada benang berbeza mestilah selamat untuk benang."

"Saya faham. Saya tidak sangka semuanya begitu serius. Terima kasih, Ellie."

"Sama-sama. Saya harap petua ini dapat membantu anda apabila Diego memberikan anda beberapa tugas mudahnya. ☺"