2013-01-21 35 views
17

Có phải màn hình trong java không giới hạn truy cập vào các biến mẫu và chỉ với các phương thức được khai báo đồng bộ hoặc mã trong các câu lệnh được đồng bộ hóa không?Màn hình java có bao gồm các biến mẫu không?

Tôi đã tạo hai luồng, thread y gọi phương thức đồng bộ hóa, được khai báo đồng bộ trong khi thread r gọi phương thức không đồng bộ không được khai báo đồng bộ. Cả hai phương thức gọi trên đối tượng được chia sẻ s.

Thread r có thể sửa đổi biến mẫu của đối tượng s trong khi màn hình hoặc khóa đối tượng đó vẫn đang được giữ bởi thread y.

Có phải màn hình trong Java không hạn chế quyền truy cập vào các biến mẫu và chỉ cho các phương thức được khai báo đồng bộ hoặc mã trong các câu lệnh được đồng bộ hóa không?

public class stuff { 

    private int a = 10; 

    public synchronized void sync() { 
     long t1 = System.currentTimeMillis(); 
     System.out 
       .println("Okay, I am in sync method. I will be waiting for 10 seconds. Current Time = " 
         + System.currentTimeMillis()); 
     while (System.currentTimeMillis() - t1 < 10000); 
     System.out 
       .println("Okay, I have waited for 10 seconds. Current time is " 
         + System.currentTimeMillis() 
         + ".Now I will exit from sync method, a= " + this.a); 
    } 

    public void unsync() { 
     System.out 
       .println("Alright, I am in unsync method the currrent time is " 
         + System.currentTimeMillis()); 
     this.a = this.a + 1; 
     System.out.println("The time of exit from unsync method is " 
       + System.currentTimeMillis()); 

    } 
} 

class t1 extends Thread { 
    stuff s; 

    public t1(stuff s) { 
     this.s = s; 
    } 

    public void run() { 
     s.sync(); 
    } 
} 

class t2 extends Thread { 
    stuff s; 

    public t2(stuff s) { 
     this.s = s; 
    } 

    public void run() { 
     s.unsync(); 
    } 
} 

class m { 
    public static void main(String args[]) throws Exception { 
     stuff s = new stuff(); 
     t1 y = new t1(s); 
     t2 r = new t2(s); 
     y.start(); 
     Thread.sleep(2000); 
     r.start(); 
    } 
} 

Đầu ra của chương trình là dưới đây:

 
Okay, I am in sync method. I will be waiting for 10 seconds. Current Time = 1358801766310 
Alright, I am in unsync method the currrent time is 1358801768343 
The time of exit from unsync method is 1358801768343 
Okay, I have waited for 10 seconds. Current time is 1358801776310.Now I will exit from sync method, 
a= 11 

Trả lời

16

Có. Giữ màn hình của một đối tượng ngăn cản một luồng khác thực thi một khối mã khác hoặc được đồng bộ trên cùng một đối tượng. Nếu một phương thức không được đồng bộ, bất kỳ luồng nào cũng có thể gọi nó bất cứ lúc nào, cho dù một luồng khác có giữ một màn hình hay không.

Mọi quyền truy cập vào quyền truy cập được chia sẻ, đã đọc chỉ đọc, phải được đồng bộ hóa nếu có ít nhất một chủ đề sửa đổi trạng thái được chia sẻ này.

3

Là nó mà màn hình trong java không hạn chế quyền truy cập vào các biến dụ và chỉ các phương pháp được tuyên bố đồng bộ hoặc mã số trong đồng bộ các câu lệnh?

Có.

Khối được đồng bộ hóa (hoặc phương pháp) là, trong số những thứ khác, loại trừ lẫn nhau. Điều đó không ngăn cản đối tượng được sử dụng như một khóa (màn hình, chúng ta hãy gọi nó là lock) để được sử dụng bên ngoài các khối đó, trong trường hợp đó không đồng bộ hóa sẽ được thực hiện. Ví dụ: một chuỗi có thể đọc hoặc viết lock trong khi một chuỗi khác nằm trong một khối được đồng bộ hóa, trong đó lock là màn hình.

Nếu bạn muốn hạn chế quyền truy cập vào một biến, bạn cần đảm bảo rằng tất cả các truy cập được thực hiện trong khi giữ khóa (bất kỳ khóa nào, miễn là nó giống nhau cho mỗi lần truy cập).

2

Đồng bộ hóa các phương thức thực hiện có hai hiệu ứng:

Trước tiên, không thể có hai lần gọi phương thức đồng bộ trên cùng một đối tượng để xen kẽ. Khi một luồng đang thực hiện một phương thức đồng bộ cho một đối tượng, tất cả các luồng khác gọi ra các phương thức đồng bộ cho cùng một khối đối tượng (tạm dừng thực hiện) cho đến khi luồng đầu tiên được thực hiện với đối tượng.

Thứ hai, khi một phương thức đồng bộ thoát, nó sẽ tự động thiết lập mối quan hệ xảy ra trước đó với bất kỳ lời gọi tiếp theo nào của phương thức được đồng bộ hóa cho cùng một đối tượng. Điều này đảm bảo rằng các thay đổi đối với trạng thái của đối tượng được hiển thị cho tất cả các luồng.

(nguồn: the Java tutorials)

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