Pertanyaan Variabel berbagi dalam metode statis


Saya memiliki pertanyaan tentang variabel di dalam metode statis. Apakah variabel di dalam metode statis berbagi lokasi memori yang sama atau apakah mereka memiliki memori terpisah?

Berikut ini contohnya.

public class XYZ
{
    Public Static int A(int value)
    {
      int b = value;
      return b;
    }
}

Jika 3 panggilan pengguna berbeda menjalankan metode A

XYZ.A(10);
XYZ.A(20);
XYZ.A(30);

pada waktu bersamaan. Apa yang akan menjadi nilai balik dari setiap panggilan?

XYZ.A(10)=?
XYZ.A(20)=?
XYZ.A(30)=?

10
2017-08-03 19:08


asal


Jawaban:


Mereka masih variabel lokal - mereka tidak dibagikan antar utas. Fakta bahwa mereka dalam metode statis tidak ada bedanya.

Jika Anda menggunakan statis variabel sebagai variabel perantara, itu akan tidak aman:

public class XYZ
{
    // Don't do this! Horribly unsafe!
    private static int b;
    public static int A(int value)
    {
        b = value;
        return b;
    }
}

Di sini, semua utas benar-benar akan menggunakan yang sama b variabel, jadi jika Anda memanggil metode dari beberapa utas secara bersamaan, utas X dapat menulis ke b, diikuti oleh benang Y, sehingga benang X akhirnya mengembalikan nilai yang ditetapkan oleh utas Y.


15
2017-08-03 19:10



Benang tidak akan menimpa nilai satu sama lain, karena variabel sepenuhnya berada di tumpukan. Setiap utas memiliki tumpukan terpisah.


4
2017-08-03 19:10



Ini bukan metode thread safe, tetapi semua varibel otomatis aman secara otomatis karena fungsi ini disebut Anda mendapatkan tumpukan frame baru. Semua penduduk setempat dibuat saat masuk ke fungsi dan dihancurkan saat keluar. Seperti dikatakan di atas jika Anda telah menggunakan penyimpanan statis maka Anda akan mendapatkan hasil yang tidak diharapkan.


1
2017-08-03 19:15



Tidak, mereka tidak berbagi ruang yang sama dalam memori. Untuk panggilan Anda, mereka akan kembali, (dalam urutan yang Anda cantumkan): 10, 20, dan 30.

Sejujurnya, dengan kode Anda ini akan benar dalam hal apa pun (karena Anda hanya memberikan nilai, tidak melakukan apa pun dengan itu), tetapi pertimbangkan:

Class XYZ
{
   public static int A (int value)
   {
      b += value;  \\Won't compile: b not initialized
      return b;
   }
}

Atau

Class XYZ
{
   public static int A (int value)
   {
      int b = 0;  \\Initialized 'b' for each call
      b += value;  
      return b;
   }
}

Karena metode statis tidak dapat mengakses variabel instan (setidaknya, tidak tanpa referensi ke sebuah instance), tidak ada cara untuk menginisialisasi variabel sekali dalam metode statis tanpa itu diinisialisasi ulang setiap kali kode dipanggil. Untuk memungkinkan metode statis untuk mengubah variabel, Anda harus memasukkan dua nilai untuk beroperasi pada satu sama lain.


1
2017-08-03 19:15