2011-10-05 40 views
7

Tôi có chương trình sau trong cùng một tệp. Tôi đã đồng bộ hóa phương thức run().Tại sao phương thức đồng bộ cho phép nhiều luồng chạy đồng thời?

class MyThread2 implements Runnable { 
    Thread t; 

    MyThread2(String s) { 
     t=new Thread(this,s); 
     t.start(); 
    } 

    public synchronized void run() { 
     for (int i=0;i<3;i++) { 
      System.out.println("Thread name : "+ Thread.currentThread).getName()); 
      try { 
       t.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.getMessage(); 
      } 
     } 
    } 
} 

class TestSync { 
    public static void main(String[] args) { 
     MyThread2 m1=new MyThread2("My Thread 1"); 
     c.fun(); 
    } 
} 

class c { 
    static void fun() { 
     MyThread2 m1=new MyThread2("My Thread 4"); 
    } 
} 

ra là

Thread name : My Thread 1 
Thread name : My Thread 4 
Thread name : My Thread 4 
Thread name : My Thread 1 
Thread name : My Thread 1 
Thread name : My Thread 4 

Câu hỏi của tôi là tại sao được đồng bộ phương pháp cho phép cả "My Chủ đề 1" và "Chủ đề của tôi 4" chủ đề truy cập đồng thời?

+2

Mã bạn gửi có ít nhất một cú pháp và thực sự khó đọc như vậy. Đảm bảo bạn đăng mã thực của mình và cố định dạng mã một cách rõ ràng. – Mat

+0

Quan niệm sai lầm là bạn đang khóa một phương pháp, thay vào đó bạn có một phương pháp khóa ví dụ. –

Trả lời

27

synchronized phương pháp hoạt động ở cấp độ cá thể. Mỗi trường hợp của lớp đều có khóa riêng. Khóa được mua lại mỗi khi bất kỳ phương thức synchronized nào của cá thể được nhập. Điều này ngăn chặn nhiều chủ đề gọi phương thức synchronizedtrên cùng một trường hợp (lưu ý rằng điều này cũng ngăn các phương pháp khác nhausynchronized không được gọi cùng một trường hợp).

Bây giờ, vì bạn có hai phiên bản của lớp, mỗi trường hợp sẽ có khóa riêng. Không có gì để ngăn chặn hai chủ đề mỗi hoạt động trên trường hợp riêng của mình đồng thời.

Nếu bạn muốn ngăn chặn điều này, bạn có thể có một khối synchronized(obj) bên run(), nơi obj sẽ có một số đối tượng được chia sẻ bởi cả hai trường hợp của lớp học của bạn:

class MyThread2 implements Runnable { 
    private static final Object lock = new Object(); 
    ... 
    public void run() { 
    synchronized(lock) { 
     ... 
    } 
    } 
} 
+0

Cảm ơn câu trả lời – user980089

+0

Nếu chúng ta chỉ có một thể hiện của lớp và nhiều luồng, có thể chạy đồng thời một số phương thức 'đồng bộ' không? – Sajad

+0

@ssss: Chắc chắn: 'static' vs non-'static', sử dụng các khối' synchronized' với các khóa khác nhau, vv Nếu bạn cần thêm thông tin, hãy đăng câu hỏi mới. – NPE

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