Synchronization in JAVA [Đồng Bộ Hóa]


Trong phần này chúng ta sẻ Có demo về sự đồng bộ hóa trong JAVA.

Từ khóa hổ trở cho việc đồng bộ hóa là [Synchronized] .

Class Syn .

Các bạn hảy chạy Thử Thì sẻ có kết quả .

Các bạn thấy là Thread A vào doStuff Lúc đó nó vẩn đang trong doStuff thì hằn ThreadB lại vào và củng làm việc trong dostuff sau đó cả 2 đi ra.

1 điều bất tiện xảy ra là khi cả 2 cùng sai một phương thức thì chuyện gì sẻ xảy ra. VD đơn giản là khi ông A này ở HN ông B này ở HCM. 2 ông đều sài chung 1 tài khoản Khi ông A này kiểm tra thì thấy còn 50tr thì nhấn rút 30tr . Trong ngay thời điểm đó ông B củng thấy trong tài khoản còn 50tr củng rút 30tr một vấn đề xảy ra. Vậy bên nào rút được [ Thì Ngân Hàng Buộc phải giải thích chuyện này😀 .] Hảy xem tiếp sự khác biệt khi thay đổi 1 chút.

Thêm từ khóa Synchronized vào trước phương thức doStuff.

Hảy xem khi ta chạy nào.

Lúc này sự động bộ hóa xảy ra. Khi ThreadA vào doStuff thì thằng B nó phải chờ ở ngoài chừng nào đến khi thằng A nó Xong mới thôi . Nên ta thấy ThreadA xong rồi mới tới threadB.

Việc sử dụng đồng bộ tùy vào trường hợp . vì sử dụng như vậy sẻ mất khá nhiều thời gian. 1 chương trình khi làm ra phải xem độ an toàn, tránh mất mát dự liệu và nhanh nên chúng ta phải biết cân bằng . câu này của đàn anh để lại sử dụng luôn

Hì phần Demo Thread mình củng dừng tại đây ^^!

14 Responses to “Synchronization in JAVA [Đồng Bộ Hóa]”

  1. nguyenvanquan7826 Says:

    em không hiểu tại sao ThreadA đang hoạt động thì ThreadB lại có thể chen ngang vào được.

    • kobee Says:

      Điều đó là bình thường trong mọi ứng dụng mà bạn. mọi chương trình chạy đều dưới dạng multi-thread .
      Bạn có thể tự mình demo một ví dụ cơ bản. Tạo ra 4 thread đếm từ 1->100 xem coi ai đếm nhanh nhất , bạn sẻ thấy mạnh thread nào nó đếm của nó chả quan tâm đến thằng khác.
      Việc synchronized phải dựa vào tùy tình huống nửa. bạn thấy đoạn code nào, hay tại vị trí nào đó, bạn chỉ muốn tại 1 thời điểm thì chỉ có 1 action can thiệp thì nên làm chuyện đó.

      Multi-thread ra sao thì khỏi phải nói rồi. Bạn viết 1 chương trình tìm kiếm số nguyên tố từ 1-> 1 tỷ. bạn dùng for chạy từ 1-> 1 tỷ. zậy sao bạn không thử hướng tới chia 1 tỷ ra làm 4 có 4 thread cùng chạy . thì sẻ nhanh hơn rồi.
      Chúc vui

      • nguyenvanquan7826 Says:

        Vâng cái đó thì em biết, tuy nhiên thì em muốn hỏi là nếu ta cứ tạo ra 2 thread thì nó sẽ cùng chạy 1 lúc hay là có lệnh nào (hoặc dấu hiệu nào) báo là cho chúng chạy cùng nhau?

      • kobee Says:

        Dấu hiệu ở chổ nào hả =]]…nó nằm trong run() đó bạn. bạn muốn nó chạy khi Thread.start(). thì hằn run() nó chạy.

        class RunnableThread implements Runnable {
        
        	Thread runner;
        	public RunnableThread() {
        	}
        	public RunnableThread(String threadName) {
        		runner = new Thread(this, threadName); // (1) Create a new thread.
        		System.out.println(runner.getName());
        		runner.start(); // (2) Start the thread.
        	}
        	public void run() {
        		//Display info about this particular thread
        		System.out.println(Thread.currentThread());
        	}
        }
        
        public class RunnableExample {
        
        	public static void main(String[] args) {
        		Thread thread1 = new Thread(new RunnableThread(), "thread1");
        		Thread thread2 = new Thread(new RunnableThread(), "thread2");
        		RunnableThread thread3 = new RunnableThread("thread3");
        		//Start the threads
        		thread1.start();
        		thread2.start();
        		try {
        			//delay for one second
        			Thread.currentThread().sleep(1000);
        		} catch (InterruptedException e) {
        		}
        		//Display info about the main thread
        		System.out.println(Thread.currentThread());
        	}
        }
        
      • nguyenvanquan7826 Says:

        Vâng em biết cái start là làm nó chạy nhưng nó phải chạy xong thread1 thì mới đến lệnh thread2 chạy chứ nhỉ?

      • kobee Says:

        Vậy bạn phải xem lại định nghĩa của thread rồi. Khi nhắc đến thread bạn cứ nghỉ đến từ ” Đồng thời “. khi bạn start 1 thread. thì nó sẻ chạy đồng thời với 1 thread khác. chứ nó không phải chờ đợi tuần tự như code chúng ta viết.

        public class DemoThread {
        	public static void main(String[] args) {
        		Thread t1 = new Thread(new MyThread(),"Thread 1");
        		t1.start();
        		System.out.println("A");
        		System.out.println("B");
        		
        	}
        }
        
        class MyThread implements Runnable{
        	
        	@Override
        	public void run() {
        		for(int i = 0; i < 10 ; i++){
        			System.out.println("i = " + i);
        		}
        		
        	}
        	
        }
        

        Result 1 : có thể là xuất A B 0 1 2 3 4 5 6 7 8 9
        Result 2 : có thể là xuất 0 1 2 3 4 5 6 7 8 9 A B
        Resutl 3 : có thể là xuất A 0 1 2 3 4 5 6 7 8 9 B
        ….
        Bạn thấy có vấn đề gì chổ này không. tại sao có 1 thread tạo ra muh lại có nhiều trường hợp kết quả như vậy, vì bản chất hàm main. củng là 1 thread (main thread). nên bạn cứ dùng thread là nghỉ đến đồng thời của các tiến trình là được. Hy vọng có thể giúp bạn.

      • nguyenvanquan7826 Says:

        Vâng, cảm ơn anh, có lẽ em cần đọc thêm về thread,😀. Rất vui khi anh dã nhiệt tình giúp đỡ em.😀. Có gì em lại làmo phiền anh nhé.

      • nguyenvanquan7826 Says:

        Anh cho em hỏi ngoài lề chút, làm sao wordpress của anh chữ nó lại bé đưọc như thế, cả phần code cũng bé nữa, của em nó cứ to đùng ra mà không thể cho bé được

      • kobee Says:

        Tùy Themes mà mình chọn thôi bạn ơi !!! Mình chọn 3 cột để sắp xếp được nhiều thứ hơn nên chử nó nhỏ lại.
        ^^! còn muốn Custom design => costs $30 =]]…thôi sài free đi cho lành…

        Uhm rất sẳn lòng nếu vấn đề mình có thể giải quết được. Nếu không giải quyết thì cùng nhau tìm hiểu vậy.

      • nguyenvanquan7826 Says:

        Vâng.😀. Cảm ơn anh nhiều

    • eneim Says:

      không biết comment bây giờ thì có muộn không nhỉ😀

      theo mình hiểu thì việc thread nào sẽ được thực thi (khi không có bất kỳ điều kiện ràng buộc nào) có vẻ khá ngẫu nhiên. bản chất của multithreading cũng là sử dụng khả năng của CPU: với CPU 1 core không hỗ trợ HyperThreading (là loại CPU cơ bản nhất) thì trong 1 thời điểm chỉ có 1 thread có thể thực thi, nhưng vì tốc độ của nó vẫn là quá lớn (1s có đến hàng tỉ clock) nên bạn không thể biết thời điểm đó thread nào đang thực thi –> ý nghĩa của sự “đồng thời” dưới mắt người. việc lựa chọn thread nào để chạy thì khi không có đồng bộ hoá nó sẽ xảy ra ngẫu nhiên, do đó kết quả mỗi lần có thể khác nhau. sau khi thêm đồng bộ hoá thì tài nguyên được sử dụng đúng nên kết quả sẽ đúng với yêu cầu.

      đối với CPU hiện nay nhiều core hỗ trợ HyperThreading (intel core i series chẳng hạn) thì 1 thời điểm (1 clock) có thể có đến 8 thread thực thi đồng thời (i7 4 core + HT, mỗi core đảm nhiệm 2 thread) nhưng cách lí giải trên vẫn có thể dùng được.

      • kobee Says:

        Thứ 1 : Điều khiển thread nào chạy trước chạy sau thì không phải vấn đề . Bạn có thể điều khiển nó quan trọng là cách thức của bạn.

        Thứ 2 Việc tạo ra nhiều thread còn tụi thuộc vào CPU và OS kể cả RAM bạn dùng, Mình core i3 3.2Ghz . Bạn nghỉ mình có thể tạo ra bao nhiêu Thread ???. Nếu mình nghỉ chắc không dưới 10.000 Thread tuan tu đâu bạn, có thể bạn có 1 sự nhầm lẫn cho multi-Thread vs multi-Process

  2. Nam Says:

    Anh oi cho em hoi cau lenh synchronized(object). Vay chu object se bi lam sao khi thuc hien cau lenh

    • kobee Says:

      Quay lại với sync bạn phải xác định rằng tại 1 thời điểm nếu có 2 người có thể cùng truy cập vào đối tượng của bạn thì bạn sync(Object).

      Giống như bạn tạo ra Interger a = 0;
      cứ mổi lần người ta login vào thì bạn a++; không may khi có 2 người cùng login tại 1 thời điểm thì sẻ ra sao. thì lúc này để đảm bảo rằng….cứ mổi người vào tăng a lên 1 . thì bạn sync(a){ a++ }. ;

      Cái này muốn biết rỏ hơn thì bạn nên xem : Lock object in java để biết chi tiết về nó


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: