Bagaimana cara Singleton Bean melayani permintaan bersamaan?

Saya punya pertanyaan tentang bagaimana kacang tunggal melayani permintaan bersamaan secara detail.

Saya telah mencari di StackOverflow mengenai pertanyaan ini. Ini adalah contoh tautan dari stackoverflow, tetapi saya hanya menemukan detail tingkat tinggi. Saya ingin rincian lengkap tentang bagaimana kacang tunggal melayani permintaan secara bersamaan dan bagaimana prosesor sistem akan melihat permintaan tersebut.

Saya telah meneliti tentang penanganan permintaan bersamaan di sistem pemroses online. Mereka mengatakan prosesor itu sendiri memiliki penjadwal dan penjadwal tersebut akan memutuskan permintaan mana yang akan diproses.

Baiklah. Jika saya memiliki lebih dari satu prosesor inti, bagaimana penjadwal menangani permintaan bersamaan?

Adakah yang bisa menjelaskan kepada saya proses langkah demi langkah tentang bagaimana singleton bean akan melayani permintaan bersamaan di JVM dan sistem?

Izinkan saya menjelaskan dengan contoh nyata. Saya memiliki kelas seperti Sports:

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

Dua permintaan masuk. Permintaan pertama adalah mengeksekusi metode playFootball pada instance tunggal kelas Sports yang dibuat. Pada saat yang sama, permintaan lain mengeksekusi metode playVolleyBall pada instance tunggal kelas Sports yang sama.

Bagaimana mungkin dengan contoh tunggal?


person saravanakumar    schedule 02.09.2014    source sumber
comment
Tidak, di tautan itu, jawabannya tidak benar untuk pertanyaan itu. Di dalamnya pengguna bertanya bagaimana kacang tunggal melayani permintaan bersamaan tetapi dia memberikan jawabannya adalah bagaimana menjadikan kacang tunggal sebagai thread yang aman. Di sini saya tidak bertanya bagaimana membuat kacang tunggal sebagai benang yang aman. saya ingin tahu logika di balik bagaimana singleton bean melayani permintaan bersamaan?   -  person saravanakumar    schedule 02.09.2014


Jawaban (6)


Saravan Kumar,

Saya memahami motivasi di balik pertanyaan Anda. Sebelum saya mulai mengerjakan kompiler, saya juga memiliki keinginan yang sangat mirip untuk mengetahui internal Java Virtual Machine.

Pertama-tama, saya terkesan dengan pertanyaan Anda. Perlu ada beberapa poin perbedaan dan pemahaman untuk menyelesaikan pertanyaan Anda. Pertama: Pola Singleton, atau kadang-kadang bahkan disebut anti-pola, memastikan bahwa hanya ada satu instance dari kelas ini yang tersedia untuk JVM (Java Virtual Machine). Ini berarti kami pada dasarnya memperkenalkan keadaan global ke dalam sebuah aplikasi. Saya tahu Anda memahami hal ini, tetapi ini hanya sekedar klarifikasi.

Sekarang bagian internalnya.

Saat kita membuat instance kelas, kita membuat objek yang berada di memori bersama JVM. Sekarang, thread ini secara independen mengeksekusi kode yang beroperasi pada instance ini. Setiap thread memiliki memori kerja, yang menyimpan data dari memori utama yang dibagikan ke semua thread. Di sinilah referensi ke objek Singleton yang Anda buat berada. Pada dasarnya apa yang terjadi adalah bytecode yang dihasilkan dan mewakili objek tunggal yang Anda buat dieksekusi pada masing-masing thread ini.

Sekarang bagian internal bagaimana hal ini terjadi adalah sebagai berikut:

Setiap thread JVM memiliki tumpukan JVM pribadi, yang dibuat bersamaan dengan thread. Sekarang, JVM memiliki heap yang dibagikan di antara semua thread JVM. Heap adalah area data runtime tempat memori untuk semua instance kelas dan array dialokasikan. Tumpukan dibuat saat permulaan VM. Saat thread Anda meminta instance singleton, thread tersebut akan menunjuk ke referensi di heap tempat bytecode untuk Singleton ini berada. Ini akan mengeksekusi kode yang sesuai. Dalam kasus Anda, ini akan mengeksekusi metode pertama untuk permintaan pertama dan metode kedua untuk permintaan kedua. Ia dapat melakukan hal ini karena tidak ada kunci atau batasan yang mencegah kompiler mengarahkan penghitung program ke area di heap tempat instance ini dialokasikan. Satu-satunya batasan yang diterapkan kelas Singleton pada Mesin Virtual Java adalah kelas tersebut hanya dapat memiliki satu instance di heap kelas ini. Itu saja. Selain itu, Anda dapat merujuknya 100x kali dari metode Anda, kompiler akan menunjuk ke bytecode yang sama dan menjalankannya. Inilah sebabnya mengapa kita biasanya ingin kelas Singleton menjadi stateless karena jika ada thread yang mengaksesnya, kita tidak ingin variabel internal dimutasi karena kurangnya kontrol konkurensi.

Tolong beri tahu saya jika Anda memiliki pertanyaan!

person Devarsh Desai    schedule 03.09.2014
comment
Terima kasih banyak atas penjelasannya. Sekarang saya mengerti dengan jelas dan saya akan memberi tahu Anda jika saya ragu. - person saravanakumar; 03.09.2014
comment
Senang mendengar Saravan Kumar! :0) Silakan menghubungi kami jika ada pertanyaan! - person Devarsh Desai; 03.09.2014
comment
@Devarsh Desai penjelasan yang bagus... +1 - person Ashish Jagtap; 04.09.2014
comment
@157. Apakah Anda tahu sesuatu tentang GWT. sekarang saya memiliki persyaratan kecil dalam aplikasi GWT saya. dapatkah Anda melihat postingan saya di sini stackoverflow.com/questions/26654031/ - person saravanakumar; 30.10.2014
comment
Kata Baik @Dev. - person Arun; 22.11.2017

Kacang tunggal yang ideal tidak boleh menyimpan keadaan apa pun. Artinya, tidak akan ada variabel apa pun yang menyimpan sesuatu yang spesifik untuk permintaan yang dilayaninya.

Dengan demikian, singleton bean hanya akan memiliki kode stateless (misalnya metode pengontrol) yang dapat dieksekusi secara bersamaan untuk beberapa permintaan tanpa masalah konkurensi.

Misalnya jika berikut ini adalah singleton bean Anda:

@Service
public class Calculator {

   public int sum(int a, int b) {
        return a + b;
   } 

}

Secara sederhana, ketika dua "permintaan" memanggil metode sum pada kacang secara bersamaan, itu berarti metode sum akan dieksekusi secara bersamaan di dua thread berbeda. Oleh karena itu, mereka akan memiliki konteks eksekusinya sendiri yang tidak akan tumpang tindih satu sama lain. Ini akan memungkinkan mereka berjalan secara bersamaan dengan aman.

Jika kacang yang sama memiliki keadaan sebagai berikut:

@Service
public class Calculator {

   int incrementalMultiplier = 0;

   public int mulitply(int a, int b) {
        incrementalMultiplier++;
        return a * b * incrementalMultiplier;
   } 

}

Hal ini dapat menyebabkan masalah ketika melayani dua permintaan secara bersamaan karena incrementalMultiplier adalah status tingkat objek yang akan dibagikan oleh dua permintaan (utas) dan karenanya dapat memberikan hasil yang tidak diharapkan.

Singkatnya, singleton tanpa kewarganegaraan akan dapat melayani dua permintaan secara bersamaan karena keduanya berada di thread yang berbeda.

person Varun Phadnis    schedule 02.09.2014
comment
Memang benar dan saya ingin tahu bagaimana kacang tanpa kewarganegaraan ini melayani permintaan bersamaan? - person saravanakumar; 02.09.2014
comment
Mencoba menjelaskannya lebih detail secara sederhana... beri tahu saya itu membantu. :) - person Varun Phadnis; 02.09.2014
comment
Ya, utas memiliki memori tumpukannya sendiri dan itu akan menyimpan nama metode dan variabel metode untuk setiap utas satu per satu. Jika konteks eksekusi berbeda untuk setiap permintaan, Bagaimana kacang yang sama akan melayani dua konteks berbeda dalam waktu yang sama? - person saravanakumar; 02.09.2014
comment
Ketika Anda berpikir pada tingkat eksekusi thread, metode kacang hanya menjadi beberapa kode untuk dieksekusi. Menurut Anda mengapa dua thread tidak dapat mengeksekusi kode yang sama secara bersamaan? Karena mereka berada dalam konteksnya sendiri dan terisolasi, ini mirip dengan program yang sama yang dijalankan pada dua komputer berbeda. - person Varun Phadnis; 02.09.2014
comment
Ya Itu harus dijalankan. Saya bertanya apa logika di balik layar. Bagaimana mereka melakukan dua pekerjaan yang berbeda atau sama dengan kacang tunggal. Sekarang saya mengerti tetapi maaf saya masih belum mengerti. Bisakah Anda menjelaskan secara rinci tentang bagaimana orang listrik (singleton bean) akan melakukan pekerjaan (metode) yang sama pada waktu yang berbeda (konteks eksekusi thread)? - person saravanakumar; 02.09.2014
comment
Kacang tidak melakukan pekerjaan apa pun, kedua utas mengeksekusi isi kode yang ditentukan dalam kacang secara bersamaan. Saya kira Anda tidak memahaminya karena pemahaman dasar ilmu komputer Anda tidak begitu jelas. Saya menyarankan untuk membahas konsep dasar. Pahami apa yang sebenarnya terjadi saat kode dijalankan. - person Varun Phadnis; 02.09.2014
comment
Terima kasih atas waktu Anda dan penjelasan yang bagus untuk saya. Dan dugaan Anda benar. Saya tidak terlalu kuat dalam dasar CS. Karena pada dasarnya saya seorang Insinyur Listrik, Tapi sekarang saya seorang insinyur perangkat lunak. - person saravanakumar; 03.09.2014
comment
Penjelasan yang bagus!! - person Abhishek Kumar; 09.12.2020

Untuk mengetahui secara detail Bagaimana cara Singleton Bean melayani permintaan bersamaan? anda harus mengetahui hal-hal berikut tentang Spring Beans

  • Cakupan kacang

    Spring memiliki cakupan kacang yang berbeda (misalnya Prototipe, Singleton, dll.) tetapi semua cakupan ini berlaku ketika kacang dibuat. Misalnya, scoped bean "prototipe" akan dibuat setiap kali bean ini "disuntikkan". sedangkan cakupan kacang "tunggal" akan dibuat satu kali dan dibagikan dalam konteks aplikasi.
    Cakupan "tunggal" adalah cakupan default Spring Bean.

  • Pembuatan Kacang

    Seluruh siklus hidup Spring Bean dikelola oleh Spring Container (yaitu ApplicationContext/BeanFacotry) Spring Container secara internal merujuk definisi bean (yaitu berbasis XML atau berbasis Anotasi) untuk membuat instance aktual dari kelas yang ditentukan oleh definisi bean tersebut. sekarang ketika Spring Container memulai, ini mengacu pada definisi kacang dan membuat semua kacang yang ditentukan.

  • Minta Kacangnya.

    Sekarang ketika objek Anda membuat permintaan ke bean maka Spring Container akan menyerahkan bean yang sudah diinisialisasi.

  • Musim semi Cakupan Kacang

  • Apakah thread objek Spring aman?

  • Tutorial Musim Semi 11 - Memahami Cakupan Bean< /kuat>

semoga ini bisa membantu anda...

person Ashish Jagtap    schedule 02.09.2014
comment
Ya, Anda benar dan terima kasih atas balasan Anda, tetapi saya tidak dapat melihat penjelasan apa pun mengenai pertanyaan saya (Bagaimana cara Singleton Bean melayani permintaan bersamaan?) pada jawaban di atas. - person saravanakumar; 02.09.2014
comment
untuk setiap permintaan ke singleton Bean container akan memberi Anda kacang yang sudah diinisialisasi pada waktu mulai container. - person Ashish Jagtap; 02.09.2014
comment
untuk setiap permintaan ke singleton Bean container akan memberi Anda bean yang sama yang sudah diinisialisasi pada waktu mulai container dan bagaimana ia akan memberikan bean yang sama pada saat permintaan bersamaan? dan bagaimana kacang yang sama akan melakukan pekerjaan yang sama (metode yang sama di kelas) atau pekerjaan yang berbeda (metode berbeda di kelas yang sama) dalam permintaan bersamaan? - person saravanakumar; 02.09.2014

Saya telah melihat banyak peringatan untuk menjaga agar singleton beans yang dibagikan tidak memiliki kewarganegaraan dan saya ingin menyajikan kasus penggunaan di mana singleton stateful dalam backing bean aplikasi web masuk akal.

Saya memiliki aplikasi web administratif yang, berdasarkan permintaan, menanyakan dua sistem terpisah (CRM dan Manajer Aset Digital - DAM) untuk data pengguna, membandingkan catatan, dan memperbarui DAM menggunakan API-nya. Hal ini terkadang membutuhkan waktu yang sangat lama jika updatenya banyak. UI web menampilkan status pembaruan secara real-time, saat browser melakukan polling pada backing bean menggunakan ajax setiap detik untuk menampilkan bilah kemajuan dan berapa banyak akun pengguna yang telah diproses. UI juga menyediakan tombol untuk memulai proses sinkronisasi dan tombol untuk menghentikannya. Tombol sinkronisasi awalnya diaktifkan dan tombol stop tidak ditampilkan. Setelah pengguna mengklik tombol start, tombol start dinonaktifkan dan tombol stop diaktifkan.

Saat sinkronisasi aktif, saya ingin klien yang berbeda (pengguna berbeda di keyboard menggunakan aplikasi web di browser masing-masing) melihat status yang sama, yaitu bilah kemajuan dan jumlah akun pengguna yang diproses serta status tombol. Hal ini penting karena tidak masuk akal untuk memulai proses sinkronisasi kedua saat proses sinkronisasi kedua sedang berlangsung.

person snakedog    schedule 24.08.2017

Pertanyaan ini sudah berusia 5+ tahun sekarang (2019) dan saya harap Anda telah menemukan apa yang Anda cari. tapi saya masih akan mengirimkan jawaban. ini mungkin tidak hanya mencakup pertanyaan Anda tetapi juga menjelaskan perilaku multi-threading secara singkat.

Pertama. singleton adalah pola desain yang digunakan dalam pemrograman, yang digunakan untuk membuat hanya satu instance untuk seluruh aplikasi (hanya satu untuk JVM. karena saya berharap hanya ada satu JVM di aplikasi Anda). multi threading adalah mekanisme pemrosesan. itu menjalankan tugas secara bersamaan. Saya pikir Anda bingung karena Anda sudah tahu bahwa thread adalah lokasi pemrosesan yang logis. dan suatu objek adalah contoh memori. tetapi Anda tidak memahami cara kerja multi-threading sebenarnya. Adapun pertanyaan Anda, saya akan menjelaskannya dengan kerangka pegas.

jadi ketika pengguna mengirim permintaan ke server, server mendedikasikan thread terpisah untuk setiap permintaan. dan di musim semi, biji kopinya adalah singleton secara default. jadi permintaan pertama mulai mengeksekusi metode singleton bean Anda, dan sebelum selesai, permintaan lain datang dan mengeksekusi metode yang sama dengan menggunakan thread lain.

jadi yang terjadi di sini adalah thread kedua tidak akan menunggu thread pertama selesai menjalankan seluruh metode. mereka mengeksekusi secara bersamaan, itu berarti permintaan pertama akan menjalankan baris pertama dari metode tersebut dan kemudian thread kedua mulai menjalankan baris pertama. dan mungkin baris kedua juga. Perhatikan bahwa ketika thread pertama mengeksekusi baris pertama, thread kedua tidak dapat mengeksekusi baris yang sama dan ketika thread kedua mengeksekusi baris pertama dan baris kedua, thread pertama tidak dapat mengeksekusi baris kedua hingga thread kedua menyelesaikan baris kedua.

meskipun kita menyebutnya eksekusi serentak, hal ini tidak dijalankan secara bersamaan sama sekali. (satu baris dieksekusi hanya oleh satu utas pada waktu yang sama) sesuai dengan pertanyaan Anda, Anda mendefinisikan dua metode dalam kacang, sehingga keduanya merupakan metode yang terpisah. jadi dua thread yang meminta kedua metode tersebut secara bersamaan akan mengeksekusinya secara bersamaan. jadi apa yang saya jelaskan tidak akan berlaku untuk skenario itu dan jika kacang Anda dibuat baru untuk setiap permintaan maka ini juga tidak akan terjadi dan dijalankan secara bersamaan.

person Tharindu Eranga    schedule 23.12.2019
comment
Paragraf kedua terakhir Anda mengingatkan saya pada film. Tapi usaha yang bagus! - person Ram; 05.07.2021
comment
@Ram, ya, sulit menjelaskan konkurensi hanya dengan menggunakan teks. - person Tharindu Eranga; 07.07.2021

Singleton adalah cakupan kacang. Anda harus menangani cara melayani untuk akses multi-thread. Anda dapat menggunakan paket sinkronisasi atau bersamaan. Referensi: Apakah kacang singleton Spring aman untuk thread?

Untuk permintaan bersamaan, single bean akan melayani beberapa permintaan satu per satu.

person CHowdappaM    schedule 02.09.2014
comment
Jika singleton bean akan melayani permintaan bersamaan satu per satu artinya, Lalu mengapa kita melakukan sinkronisasi karena permintaan akan diproses satu per satu. Apakah saya benar ? - person saravanakumar; 02.09.2014
comment
Permintaan bersamaan memulai pemanggilan metode satu per satu (walaupun ini juga tidak sepenuhnya benar), namun eksekusi dapat didahului, sehingga thread baru memulai pemanggilan metode yang sama. Masalahnya adalah, jika kacangnya tunggal, contoh yang sama digunakan, dan kedua eksekusi melihat bidang tunggal yang sama; itu mungkin terjadi (dan itu terjadi) bahwa eksekusi pertama Anda menetapkan nilai bidang, kemudian dikosongkan terlebih dahulu, dan memulai pemanggilan kedua. Jika pemanggilan kedua mengubah nilai bidang tersebut, pemanggilan pertama akan membaca nilai yang diubah. - person Dan M; 02.09.2014
comment
@Dan M Ya memang. tapi itu bukan keraguanku. Kacang saya tidak memiliki NEGARA APAPUN DAN dinyatakan sebagai FINAL untuk menjadikannya kacang yang aman untuk thread. Keraguan saya adalah bagaimana kacang yang sama (Kacang Singleton) dan waktu yang sama akan melayani dua permintaan atau lebih? - person saravanakumar; 02.09.2014