2011-11-04 33 views
8
public static int rank(int key, int[] a) { 
     int lo = 0; 
     int hi = a.length - 1; 
     while (lo <= hi) { 
      // Key is in a[lo..hi] or not present. 
      int mid = lo + (hi - lo)/2; 
      if  (key < a[mid]) hi = mid - 1; 
      else if (key > a[mid]) lo = mid + 1; 
      else return mid; 
     } 
     return -1; 
    } 

Phương thức tĩnh ở trên thực hiện tìm kiếm nhị phân. Nó có an toàn không? Tôi biết rằng các biến cục bộ là luồng an toàn nhưng "a" ở đây là một mảng, do đó điều đó có nghĩa đó là một đối tượng trong Java, phải không? Đó có phải là vấn đề không? Mảng vừa được đọc, không được sửa đổi theo bất kỳ cách nào, vì vậy tôi giả sử phương pháp này là an toàn chỉ. Nhưng tôi muốn chắc chắn rằng tôi hiểu tại sao.Các mảng Java trong một luồng phương thức tĩnh có an toàn không?

Cảm ơn!

Trả lời

7

Không mảng không nói chung là an toàn. Cho dù mã của bạn là trong trường hợp này phụ thuộc vào việc các chủ đề khác có quyền truy cập vào mảng mà bạn đã thông qua. Bởi vì mảng được truyền theo tham chiếu, sau đó các luồng khác có thể có quyền truy cập vào chúng.

Nếu bạn chỉ tạo/sửa đổi mảng trong một chuỗi đơn lẻ hoặc nếu bạn chuyển một bản sao được sao chép theo cách an toàn, nó sẽ ổn.

+0

Tôi hiểu. Vì vậy, mã không phải là thread an toàn mặc dù mảng không được sửa đổi, phải không? Nhưng miễn là mỗi thread gọi phương thức này thực hiện nó với một đối tượng mảng khác, thì cuộc sống là tốt. – user247866

+4

BTW - Tôi không nghĩ có thể nói rằng các mảng được chuyển qua tham chiếu (nhưng tôi hiểu ý của bạn là gì). Chính xác hơn để nói rằng tham chiếu mảng được truyền theo giá trị. Cảm ơn! – user247866

+1

Chỉ vì một số chủ đề khác có thể sửa đổi nó cùng một lúc bạn đang đọc nó. –

0

có, nó là chủ đề an toàn, như bạn nói rằng bạn chỉ đọc mảng, chỉ những rắc rối có thể có được nếu một thread khác đang cập nhật mảng thời gian tương tự như phương pháp này đọc nó

+4

Một chủ đề khác vẫn có thể chỉnh sửa một mục của mảng tại cùng một thời điểm. – BalusC

+0

vâng, đó là ý tôi là quá –

+1

Ban đầu, câu trả lời của bạn không nằm trong câu trả lời của bạn, bạn đã chỉnh sửa nó ngay sau trong vòng 5 phút ân hạn. – BalusC

1

Bản thân phương thức là an toàn chỉ vì nó chỉ lấy đối số của nó và đọc chúng mà không xuất bản chúng lên bất kỳ chuỗi nào khác. Nhưng điều đó không có nghĩa là bạn không thể gặp vấn đề về luồng. Tất cả phụ thuộc vào nơi các đối số đến từ đâu.

Nếu các đối số cấu thành trạng thái chia sẻ giữa các luồng, thì mọi truy cập vào trạng thái này sẽ được đồng bộ hóa bằng cách nào đó. Nhưng bạn phải thiết lập chính sách đồng bộ giữa các luồng để bảo vệ quyền truy cập vào trạng thái này. Vì vậy, phương pháp này, hoặc người gọi của phương pháp này, nên đảm bảo rằng quyền truy cập vào trạng thái là an toàn chỉ. Nếu không biết các đối số đến từ đâu, thì không thể biết mã này có an toàn hay không.

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