2010-08-03 40 views
10

Tôi có câu hỏi về các biến bên trong phương thức tĩnh. Các biến bên trong phương thức tĩnh có cùng vị trí bộ nhớ hoặc chúng có bộ nhớ riêng không?Chia sẻ biến trong phương thức tĩnh

Đây là một ví dụ.

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

Nếu 3 cuộc gọi người dùng khác nhau thực hiện phương pháp A

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

cùng một lúc. Giá trị trả lại của mỗi cuộc gọi là gì?

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

Xem: http://stackoverflow.com/questions/420895/how-do-i-know-if-a-c-method-is-thread-safe –

+0

Bạn có đang sử dụng bất kỳ chủ đề nào không? –

Trả lời

15

Chúng vẫn là các biến cục bộ - chúng không được chia sẻ giữa các chuỗi. Thực tế là họ đang ở trong một phương pháp tĩnh không có sự khác biệt.

Nếu bạn sử dụng một tĩnh biến là biến trung gian, mà sẽ thể không an toàn:

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

Ở đây, tất cả các chủ đề thực sự sẽ được sử dụng cùng một biến b, vì vậy nếu bạn gọi là phương pháp từ nhiều chủ đề cùng một lúc, chủ đề X có thể ghi vào b, tiếp theo là chuỗi Y, sao cho chuỗi X kết thúc trả về giá trị được đặt bởi chuỗi Y.

4

Chủ đề sẽ không ghi đè lên các giá trị của nhau vì các biến nằm hoàn toàn trên ngăn xếp. Mỗi luồng có một ngăn xếp riêng biệt.

1

Đây không phải là phương pháp an toàn chủ đề nhưng tất cả tự động varibles là thread an toàn automaticly kể từ khi bao giờ thời gian chức năng được gọi là bạn có được một khung stack mới. Tất cả những người dân địa phương được tạo ra khi nhập vào chức năng và bị phá hủy khi thoát. Như đã nói ở trên nếu bạn đã sử dụng bộ nhớ tĩnh thì bạn sẽ nhận được kết quả không mong muốn.

1

Không, chúng không chia sẻ cùng một không gian trong bộ nhớ. Đối với cuộc gọi của bạn, họ sẽ trả lại, (theo thứ tự bạn đã liệt kê): 10, 2030.

Thành thực mà nói, với mã của bạn này sẽ đúng trong mọi trường hợp (kể từ khi bạn chỉ cần gán một giá trị, chứ không phải làm bất cứ điều gì với nó) nhưng xem xét:

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

Hoặc

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

Vì một phương thức tĩnh không thể truy cập một biến cá thể (ít nhất, không có tham chiếu đến một cá thể), không có cách nào để khởi tạo biến một lần trong một phương thức tĩnh mà không được khởi tạo lại mỗi lần mã được gọi. Để cho phép một phương thức tĩnh thay đổi một biến, bạn sẽ cần phải truyền vào hai giá trị để hoạt động trên eachother.

+0

Trừ khi bạn có một biến tĩnh, tất nhiên. –

+0

Đúng. Sử dụng chúng thường xuyên như vậy tôi quên chúng ... cho câu hỏi cụ thể này, mà không có vẻ như một vấn đề, tuy nhiên. – AllenG

Các vấn đề liên quan