Saya memiliki fungsi yang menggunakan Pattern#compile
dan Matcher
untuk mencari daftar string untuk suatu pola.
Fungsi ini digunakan di banyak utas. Setiap utas akan memiliki pola unik yang diteruskan ke Pattern#compile
saat utas dibuat. Jumlah utas dan pola dinamis, artinya saya dapat menambahkan lebih banyak Pattern
s dan utas selama konfigurasi.
Apakah saya perlu synchronize
menggunakan fungsi ini jika menggunakan regex? Apakah regex di thread java aman?
compile()
metodenya mungkin tidak. Ada dua atau tiga bug selama bertahun-tahun yang menyebabkan kompilasi gagal di lingkungan multithread. Saya akan merekomendasikan melakukan kompilasi dalam blok tersinkronisasi.Keamanan thread dengan ekspresi reguler di Java
sumber
Meskipun Anda perlu mengingat bahwa keamanan utas juga harus mempertimbangkan kode di sekitarnya, Anda tampaknya beruntung. Fakta bahwa Pencocokan dibuat menggunakan metode pabrik pencocokkan Pola dan kurangnya konstruktor publik adalah tanda positif. Demikian juga, Anda menggunakan metode statis kompilasi untuk membuat Pola yang mencakup .
Jadi, singkatnya, jika Anda melakukan sesuatu seperti contoh:
kamu harus melakukannya dengan cukup baik.
Tindak lanjut dari contoh kode untuk kejelasan: perhatikan bahwa contoh ini sangat menyiratkan bahwa Matcher yang dibuat adalah thread-local dengan Pola dan pengujian. Yaitu, Anda tidak boleh mengekspos Matcher yang dibuat ke utas lainnya.
Terus terang, itulah risiko dari pertanyaan keamanan utas apa pun. Kenyataannya adalah bahwa kode apa pun dapat dibuat thread-unsafe jika Anda berusaha cukup keras. Untungnya, ada buku bagus yang mengajari kita banyak cara untuk merusak kode kita. Jika kita menjauh dari kesalahan itu, kita sangat mengurangi kemungkinan masalah threading kita sendiri.
sumber
Sekilas kode untuk
Matcher.java
menunjukkan sekelompok variabel anggota termasuk teks yang cocok, array untuk grup, beberapa indeks untuk memelihara lokasi dan beberapaboolean
untuk negara lain. Ini semua mengarah ke statefulMatcher
yang tidak akan berperilaku baik jika diakses oleh banyak orangThreads
. Begitu juga dengan JavaDoc :Ini hanya masalah jika, seperti yang dikatakan @Bob Cross, Anda berusaha keras untuk mengizinkan penggunaan Anda
Matcher
diThread
s yang terpisah . Jika Anda perlu melakukan ini, dan menurut Anda sinkronisasi akan menjadi masalah bagi kode Anda, opsi yang Anda miliki adalah menggunakanThreadLocal
objek penyimpanan untuk mempertahankanMatcher
per thread yang berfungsi.sumber
Singkatnya, Anda dapat menggunakan kembali (tetap dalam variabel statis) Pola yang telah dikompilasi dan memberi tahu mereka untuk memberi Anda Matcher baru ketika diperlukan untuk memvalidasi pola regex tersebut terhadap beberapa string
lihat http://zoomicon.wordpress.com/2012/06/01/validating-e-mails-using-regular-expressions-in-java/ (di bagian akhir) mengenai pola RegEx yang digunakan di atas untuk memvalidasi email ( jika tidak sesuai dengan kebutuhan untuk validasi email seperti yang diposting di sini)
sumber
static {}
? Anda dapat memasukkan inisialisasi variabel itu dan membuatPattern
final
juga.private static final Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
lebih baik.