Sebelum berbicara tentang keamanan utas Struts2, izinkan saya berbicara tentang apa itu keselamatan utas? Inilah yang dikatakan seorang netizen.
Jika kode Anda dalam proses di mana Anda berada, ada beberapa utas yang berjalan pada saat yang sama, dan utas ini dapat menjalankan kode ini secara bersamaan. Jika hasil dari setiap proses sama dengan hasil dari satu utas yang dijalankan, dan nilai-nilai variabel lain sama dengan yang diharapkan, itu aman.
Artinya, dalam suatu proses, banyak utas dieksekusi secara bersamaan. Selama eksekusi masing-masing utas, nilai variabelnya sama dan hasil eksekusi sama, yang aman-utas. Kalau tidak, utasnya tidak aman.
Kemudian tinjau masalah keselamatan utas dari servlets. Karena servlet adalah mode singleton, hanya satu contoh yang akan dihasilkan. Ketika banyak pengguna meminta servlet secara bersamaan, Tomcat akan memperoleh beberapa utas untuk menjalankan kode servlet. Oleh karena itu, servlets-aman. Jika digunakan secara tidak benar, masalah dapat terjadi. Inilah contohnya:
Paket com.wang.servlet; impor java.io.ioException; import java.io.printwriter; import javax.servlet.servletException; import javax.servlet.http.httpservlet; impor javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; Public Class ThreadSafeServlet memperluas httpservlet {private string name; // tentukan name variabel pribadi publik void doGet (httpservletRequest, httpservleteSponseRese) LoysePlexception, httpservleteSconse) Layanan Layanan, httpservlequest, httpservleteSconsconsconse), httpservlequest, httpservleteSconse) loug response.setContentType ("Teks/html"); // Dapatkan atribut nama dari nama bidang permintaan = request.getParameter ("name"); // Biarkan utas tidur selama 10 detik coba {thread.sleep (10000); } catch (InterruptedException e) {E.PrintStackTrace (); } // nilai nama output ke browser response.getWriter (). Print ("name ="+name); }}Kami menggunakan dua browser untuk mengakses ThreadSafeServlet? Name = "Zhangsan" dan ThreadSafeServer? Name = "Lisi" dalam waktu sepuluh detik. Hasilnya sama -sama nama = Lisi, yang berarti ada masalah dengan program. Bacaan dan penulisan bersamaan multi-thread akan menyebabkan data keluar dari sinkronisasi. Oleh karena itu, saat menggunakan servlet, kami mencoba untuk tidak mendefinisikan atribut pribadi global, tetapi mendefinisikan variabel menjadi metode doGet () dan dopost (). Tentu saja, jika itu hanya operasi yang dibaca, tidak akan ada masalah. Oleh karena itu, jika Anda ingin mendefinisikan atribut read-only global dalam servlets, yang terbaik adalah menentukan jenis akhir.
Tindakan di Struts2 membuat contoh untuk setiap permintaan. Tidak ada perbedaan antara aksi dan kelas Java biasa, dan tidak akan ada data yang tidak disinkronkan, jadi ini aman.
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.