Secara konseptual apa artinya ketika dikatakan bahwa setiap utas mendapat tumpukannya sendiri?

10

Saya telah membaca Java Concurrency in Practice oleh Brian Goetz dan di dalam bagian Stack Confinement disebutkan bahwa setiap utas mendapatkan tumpukannya sendiri dan variabel lokal secara intrinsik terbatas pada utas pelaksana; mereka ada di tumpukan thread yang sedang dieksekusi, yang tidak dapat diakses oleh utas lainnya. Apa maksudnya bahwa setiap utas memiliki tumpukan eksekusi sendiri?

Kutu buku
sumber
4
Untuk pemahaman lebih dalam tentang ini, lihat register penunjuk tumpukan dan bagaimana digunakan dalam perakitan. Ini akan menjelaskan bagaimana utas dapat dengan mudah memiliki tumpukan mereka sendiri.
Peter Smith
1
Setuju dengan Peter Smith. Mungkin butuh waktu, tetapi setelah itu Anda mendapatkan pengetahuan yang sempurna tentang apa, bagaimana dan mengapa ini terjadi
superM

Jawaban:

13

Anda tahu kapan Anda membobol debugger untuk alasan apa pun, dan IDE memberi Anda jejak stack? Dan setiap metode (stack frame) memiliki set variabel lokal sendiri yang dapat Anda periksa di debugger?

Itulah "tumpukan eksekusi" dari program Anda. Ini menunjukkan seperti apa kondisi lokal program Anda saat ini. Apa yang penulis katakan adalah bahwa setiap utas mendapat tumpukan eksekusi yang berbeda seperti itu. Ini memiliki tumpukan panggilan sendiri, dan masing-masing metode memiliki variabel lokal mereka sendiri.

Karena variabel disimpan sebagai bagian dari tumpukan eksekusi dan bukan di heap, mereka unik untuk utas yang sedang dijalankan dan tidak dapat dibagi secara langsung. Anda dapat menyalinnya, atau meneruskan referensi ke objek ke utas lain dengan berbagai cara, jadi itu sebagian besar merupakan perbedaan akademis.

Mason Wheeler
sumber
Harap tambahkan penekanan yang lebih kuat pada paragraf ketiga Anda untuk menyatakan bahwa variabel lokal yang terpapar ke utas lainnya atau objek yang berumur panjang tidak akan lagi terbatas. Dengan demikian, klaim yang dikutip dari buku OP sangat meragukan.
rwong
4
@ rwong: Tidak mungkin untuk mengekspos variabel lokal ke utas lain dalam cara yang akan bermasalah. Variabel hanya mengandung primitif atau referensi. Objek hidup di heap.
Michael Borgwardt
@MichaelBorgwardt Mari kita mengambil dua kasus secara terpisah mengatakan variabel berisi primitif yaitu kasus A dan mengatakan variabel berisi referensi yang merupakan huruf B. Karena primitif dilewatkan oleh nilai, variabel lokal memang aman tetapi bagaimana dengan referensi. Mereka bisa diedarkan? Mengapa Anda mengatakan itu tidak mungkin?
Geek
2
@ Geek: Karena variabel dan objek yang dimaksud adalah dua hal yang berbeda dan berbeda yang tidak boleh bingung ketika berbicara pada tingkat detail ini. Variabel lokal tidak dapat diekspos ke utas berbeda. Benda tentu saja bisa.
Michael Borgwardt
@MichaelBorgwardt, saya mengerti apa yang Anda katakan. Terima kasih atas klarifikasi.
Geek