2013-07-16 54 views
6

Khi một thành viên Java cần phải được thread-safe, chúng ta làm như sau:Chức năng đồng bộ hóa tĩnh hoạt động như thế nào?

public synchronized void func() { 
    ... 
} 

cú pháp tương đương này để:

public void func() { 
     synchronized(this) { 
      .... 
     } 
} 

Nghĩa là, nó thực sự sử dụng this cho một khóa.

Câu hỏi của tôi là, nếu tôi sử dụng synchronized với một phương pháp static, như sau:

class AA { 
    private AA() {} 

    public static synchronized AA getInstance() { 
     static AA obj = new AA(); 
     return obj; 
    } 
} 

Trong trường hợp này, về những gì đang khóa làm cho phương pháp synchronized?

+0

Lớp AA sẽ bị khóa 'đồng bộ (AA.class) ', nhưng không có trường hợp –

+3

Không phải là việc khai báo tĩnh của biến cục bộ' obj' lỗi cú pháp? – Thilo

Trả lời

13

Trong trường hợp của phương pháp đồng bộ tĩnh, đối tượng class của bạn class AA sẽ khóa ngầm

của nó tương đương với

class AA { 
    private AA() {} 

    public static AA getInstance() { 
     synchronized(AA.class) { 
      AA obj = new AA(); 
      return obj; 
     } 
    } 
} 
+3

+1. tương đương với 'đồng bộ hóa (AA.class) {' – Thilo

+0

nhưng những gì về 'tĩnh AA obj = new AA();' - nó sẽ không cung cấp cho thời gian biên dịch lỗi? – exexzian

+0

vâng, bây giờ tốt của nó – exexzian

7

Từ section 8.4.3.6 of the JLS:

Một phương pháp đồng bộ có được một màn hình (§17.1) trước khi nó thực hiện.

Đối với phương thức lớp (tĩnh), màn hình được liên kết với đối tượng Class cho lớp của phương thức được sử dụng.

Vì vậy, mã của bạn mua lại màn hình cho AA.class. Như sanbhat nói, nó giống như

synchronized(AA.class) { 
    ... 
} 

... cũng giống như với một phương pháp dụ nó sẽ là

synchronized(this) { 
    ... 
} 
0

Nó làm việc trên khóa AA.class.

public static AA getInstance() { 
     synchronized(AA.class){ 
      static AA obj = new AA(); 
      return obj; 
     } 

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