2013-08-31 18 views
10
Class Shared{  
    public void sharedMethod(Object o){ 
      //does something to Object 
    }  
} 

//this is how threads call the shared method 
run(){ 
    sharedInstance.sharedMethod(someObject); 
} 

Hiện tại, o đang được chuyển làm tham số cho phương thức. Và cùng một phương thức được gọi bởi nhiều luồng song song. Chúng ta có thể nói rằng mã này an toàn không?Chuỗi thông số phương pháp có an toàn trong Java không?

Có hai kịch bản:

  • Nếu someObject đang được chia sẻ giữa các chủ đề
  • Nếu mỗi chủ đề có bản sao riêng của mình someObject
+0

Không, bạn không thể nói điều đó. – bmargulies

Trả lời

10

Không bạn không thể nói như vậy. Tham số phương thức là cục bộ cho các luồng, nghĩa là mỗi biến có một tham chiếu riêng của biến tham chiếu o, Nhưng nếu bạn gọi phương thức này với cùng một đối tượng từ nhiều luồng, thì đối số sẽ được chia sẻ giữa chúng (hãy nhớ rằng Java là pass-by) -giá trị). Trong trường hợp đó, bạn cần phải cung cấp đồng bộ hóa rõ ràng để tránh phiền hà.

+0

Bạn có 2 bản sao riêng biệt của "tham chiếu" (một trong phương thức gọi, một trong phương thức được gọi - vì giá trị truyền qua), không phải là "đối tượng". Thay đổi "tham chiếu" trong một phương thức không ảnh hưởng đến phương thức khác (ví dụ 'o = null' trong phương thức được gọi là không hủy bỏ' o' trong phương thức gọi), nhưng thay đổi "đối tượng" mà chúng tham chiếu đến (trong trường hợp này) cả hai tham chiếu đến cùng một đối tượng) đều hiển thị với đối tượng kia. Do đó cả hai chủ đề làm việc trên cùng một đối tượng và do đó không thread an toàn. – user104309

0

Có, nhưng chỉ trong hai kịch bản:

  • nếu mỗi đối tượng bạn vượt qua trong tham số obất biến,
  • nếu mã của bạn đảm bảo rằng có ít nhất một thread làm việc trên đối tượng được tham chiếu bởi o.

Nếu không - no, vì trạng thái bên trong của đối tượng có thể được thay đổi đồng thời nhiều chủ đề.

1

Nếu bạn gọi cùng một phương thức trong nhiều chủ đề và chuyển cùng một đối tượng, đối tượng đó hoàn toàn là không phải là an toàn.

1

Khi bạn tạo một chủ đề, nó sẽ có ngăn xếp của riêng nó được tạo (phương thức và biến cục bộ).

Hai luồng sẽ có hai ngăn xếp và một chuỗi không bao giờ chia sẻ ngăn xếp của nó với bất kỳ chuỗi nào khác.

Nó sẽ không có hiệu lực cho đến khi bạn gọi nó trên cùng một đối tượng.

+1

@Narenda đang nói về các tham số đối tượng (thông qua tham chiếu), vì vậy nó không phải là chủ đề an toàn. – camposer

0

Biến cục bộ được lưu trữ trong ngăn xếp của từng luồng. Điều đó có nghĩa là các biến cục bộ không bao giờ được chia sẻ giữa các luồng. Điều đó cũng có nghĩa là tất cả các biến nguyên thủy cục bộ là luồng an toàn.

EDIT

Các dụ LocalObject trong ví dụ này không được trả lại từ phương pháp này, cũng không phải là nó truyền cho bất kỳ đối tượng khác có thể truy cập từ bên ngoài phương pháp sharedMethod().

Mỗi luồng thực hiện phương thức sharedMethod() sẽ sử dụng tham số o riêng của đối tượng.

Vì vậy, toàn bộ phương pháp sharedMethod() có vẻ là chuỗi an toàn.

Ngoại lệ duy nhất là tất nhiên, nếu một trong các phương pháp được gọi với đối tượng o làm tham số, lưu trữ cá thể đối tượng o theo cách cho phép truy cập từ các chủ đề khác.

0

Hãy đối xử với nó theo cách này.

Nếu chủ đề của bạn không chia sẻ bất kỳ tài nguyên chung nào, thì không thể có vấn đề về tương tranh. Nhiều như chúng tôi có thể biết từ thông tin bạn cung cấp, điều duy nhất có thể được chia sẻ ở đây, là someObject. Nếu chính chuỗi an toàn của chính nó hoặc đang được sao chép cho từng chuỗi, thì mã của bạn là an toàn chỉ chung, trừ khi có các tài nguyên được chia sẻ khác.

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