Synchronization in java


Hôm nay mình làm một bài đơn giản về đồng bộ hóa giữa các Thread.

Mình có từng post 1 bài từ trước hôm nay mình fix lại tí cách giao tiếp của chúng.

Chúng ta có một OBJECT . Đối tượng này được dùng chung cho cả 2 Thread.

Đơn giản là Khi Thread 1 => Truy cập OBJECT . Nó tăng biến i lên 1 => Xuât ra, tương tự cho thread 2 nó củng truy cập vào và làm như vậy

Như vậy sẻ có 1 trường hợp gọi là RACE CONDITION. thỉnh thoảng 2 Thread cùng lúc vào trong đó, cùng lúc tăng lên 1 . dẫn tới xuất ra cùng 1 kết quả.

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 :D .]

theo như bài trên chúng ta sẻ thấy có 1 trường hợp kết quả xuất ra sẻ trùng như hình :

d1

Để né tránh điều này chúng ta dùng 1 từ khóa đó là synchronized.

Method ban đầu của object

public void increaseValue(){
		pause();
		i++;
		System.out.println(i);
	}

Sửa lại :

public synchronized void increaseValue(){
		pause();
		i++;
		System.out.println(i);
	}

một cách khác. từ Java 5 đả có thêm 1 đối tượng Lock để thực hiện cho việc đồng bộ hóa này.
chúng ta có thể thay từ synchronized và làm như sau :

private Lock myLog = new ReentrantLock();
	public void increaseValue(){
		myLog.lock();
		pause();
		i++;
		System.out.println(i);
		myLog.unlock();
	}

===========================================================================

Toàn bộ Source code như sau :

package test.synchoronize;

public class MyObject {

	int i = 0;

	public synchronized void increaseValue(){
		pause();
		i++;
		System.out.println(i);
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	public void pause(){
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

Thread A – Thread B tượng tự là cùng thread

package test.synchoronize;

public class ThreadA implements Runnable{
	MyObject object;

	public ThreadA(MyObject object) {
		super();
		this.object = object;
	}
	public void run() {
		while(true){
			object.increaseValue();
		}
	}

}

Class Main

public class MainTest {
	public static void main(String[] args) {
		MyObject object = new MyObject();

		Thread tA = new Thread(new ThreadA(object));
		Thread tB = new Thread(new ThreadA(object));

		tA.start();
		tB.start();
	}
}

Hy vọng giúp ích các bạn. Có câu hỏi gì thì cứ bỏ dưới…mình không nhận pro nhưng mình help hết cái mình =]] =]]

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: