2012-12-17 18 views
35

Có cách nào chung hay quy tắc thoát mà chúng tôi có thể đảm bảo an toàn luồng của các phương pháp tĩnh được sử dụng cụ thể trong các lớp Tiện ích khác nhau của bất kỳ ứng dụng nào. Ở đây tôi muốn chỉ ra một cách cụ thể sự an toàn của các ứng dụng Web.Làm thế nào để đảm bảo an toàn luồng của phương pháp tĩnh tiện ích?

Nó cũng biết rằng phương pháp tĩnh với các đối tượng không thể thay đổi như các tham số là thread an toàn và Mutable Objects thì không.

Nếu tôi có phương pháp tiện ích cho một số thao tác của java.util.Date và phương thức đó chấp nhận một phiên bản java.util.Date, thì phương pháp này sẽ không phải là chủ đề an toàn. Sau đó làm thế nào để làm cho nó thread an toàn mà không thay đổi cách thông số đi qua?

public class DateUtils { 

    public static Date getNormalizeDate(Date date) { 
     // some operations 
    } 
} 

Cũng là lớp học javax.faces.context.FacesContext có thể thay đổi? Có thread an toàn để vượt qua một thể hiện của lớp này để phương pháp tiện ích tĩnh như vậy?

Danh sách các lớp này, các thể hiện trong đó có thể hoặc không thể được chuyển thành các tham số, có thể dài; Vậy chúng ta nên lưu ý những điểm nào khi viết mã của các lớp tiện ích như vậy?

+2

Tại sao bỏ phiếu và một yêu cầu đóng? Nó là một câu hỏi sai? –

+0

Bạn đã cân nhắc tạo phương thức tĩnh 'đồng bộ' này chưa? –

+6

@AndrewLogvinov vâng tôi đã nghĩ. Nhưng tôi không muốn thực hiện một phương thức đồng bộ mà không biết tại sao tôi lại làm nó. Trong tình huống nào chúng ta nên tạo một phương thức tĩnh đồng bộ? –

Trả lời

46

Nó được biết rằng các phương pháp tĩnh với các đối tượng bất biến như các tham số là chủ đề an toàn và có thể thay đổi được không.

Tôi sẽ phản đối điều này. Các đối số được truyền cho một phương thức được lưu trữ trên một ngăn xếp, đó là một thành ngữ cho mỗi luồng.

Nếu tham số của bạn là đối tượng có thể thay đổi chẳng hạn như Date thì bạn cần phải đảm bảo các chủ đề khác không sửa đổi nó cùng một lúc ở nơi khác. Nhưng đó là một vấn đề khác không liên quan đến chủ đề an toàn của phương pháp của bạn.

Phương pháp bạn đăng là an toàn chỉ. Nó không duy trì trạng thái và chỉ hoạt động trên các đối số của nó.

Tôi thực sự khuyên bạn nên đọc Java Concurrency in Practice hoặc một cuốn sách tương tự dành riêng cho an toàn luồng trong Java. Đó là một chủ đề phức tạp không thể giải quyết một cách thích hợp thông qua một vài câu trả lời StackOverflow.

+0

Câu trả lời hay, cảm ơn – Keerthivasan

3

Tôi khuyên bạn nên tạo bản sao của đối tượng đó (có thể thay đổi) ngay khi phương thức bắt đầu và sử dụng bản sao thay vì thông số ban đầu.

Something như thế này

public static Date getNormalizeDate(Date date) { 
    Date input = new Date(date.getTime()); 
    // ... 
} 
+2

Điều này nghe có vẻ tốt cho Ngày, nhưng sẽ không thể cho các đối tượng tùy chỉnh, đặc biệt nếu nó là đối tượng tùy chỉnh của bên thứ 3 mà anh ấy không thể chỉnh sửa. –

11

Kể từ khi lớp học của bạn không giữ bất kỳ biến thành viên, phương pháp của bạn là quốc tịch (nó chỉ sử dụng các biến địa phương và lập luận) và do đó là chủ đề an toàn.

Mã gọi đó có thể không phải là chuỗi an toàn nhưng đó là một cuộc thảo luận khác. Ví dụ, ngày không phải là chủ đề an toàn, nếu mã gọi điện thoại đọc một ngày đã được viết bởi một chủ đề khác, bạn phải sử dụng đồng bộ hóa thích hợp trong ngày viết và đọc mã.

4

Với cấu trúc của JVM, biến cục bộ, tham số phương thức và giá trị trả về vốn vốn là "an toàn chỉ". Nhưng các biến mẫu và biến lớp sẽ chỉ an toàn cho chuỗi nếu bạn thiết kế lớp của mình một cách thích hợp. thêm here

0

Đây là cách tôi nghĩ về nó: hãy tưởng tượng một CampSite (đó là một phương pháp tĩnh).Là một người cắm trại, tôi có thể mang theo một loạt các vật thể trong ba lô của tôi (đó là các đối số được truyền vào trong ngăn xếp). CampSite cung cấp cho tôi một nơi để đặt lều của tôi và trại của tôi, vv, nhưng nếu điều duy nhất CampSite làm là cho phép tôi sửa đổi các đối tượng của riêng tôi thì đó là chủ đề an toàn. CampSite thậm chí có thể tạo ra những thứ trong không khí mỏng (FirePit firepit = new FirePit();), cũng được tạo ra trên ngăn xếp.

Bất cứ lúc nào tôi có thể biến mất với tất cả các đồ vật trong lồng của tôi và một trong những trại viên khác có thể xuất hiện, làm chính xác những gì họ đang làm lần cuối cùng họ biến mất. Chủ đề khác nhau trong CampSite này sẽ không có quyền truy cập vào các đối tượng trên ngăn xếp tạo ra CampSite trong các chủ đề khác.

Giả sử chỉ có một campStove (một đối tượng duy nhất của CampStove, không phải là các cảnh báo riêng biệt). Nếu bởi một số căng của trí tưởng tượng tôi đang chia sẻ một đối tượng CampStove sau đó có những cân nhắc đa luồng. Tôi không muốn bật campStove của tôi, biến mất và sau đó xuất hiện trở lại sau khi một số người cắm trại khác đã tắt nó - Tôi sẽ mãi mãi kiểm tra nếu con chó nóng của tôi đã được thực hiện và nó sẽ không bao giờ. Bạn sẽ phải đặt một số đồng bộ hóa ở đâu đó ... trong lớp CampStove, trong phương thức đang gọi CampSite, hoặc trong chính CampSite ... nhưng giống như Duncan Jones nói, "đó là một vấn đề khác".

Lưu ý rằng ngay cả khi chúng tôi đang cắm trại trong các cảnh báo riêng biệt của các đối tượng CampSite không -static, chia sẻ campStove sẽ có cùng các cân nhắc đa luồng.