java synchronized死鎖的好例子

關於java死鎖的一個好demo。要避免dead-lock,就應該控制同步的數量和可能共用的資源的訪問(代碼源於網上,略加修改)

/**
 * @author yicong
 * @date 2016年3月22日 下午1:44:32
 * @todo 死鎖的經典例子
 */
public class DeadLock {

	public static void main(String[] args) {

		// These are the two resource objects we'll try to get locks for
		final Object resource1 = "resource1";
		final Object resource2 = "resource2";

		// Here's the first thread. It tries to lock resource1 then resource2
		Thread t1 = new Thread() {

			public void run() {

				// Lock resource 1
				synchronized (resource1) {
					System.out.println("Thread 1: locked resource 1");
					
					// Pause for a bit, simulating some file I/O or
					// something. Basically, we just want to give the
					// other thread a chance to run. Threads and deadlock
					// are asynchronous things, but we're trying to force
					// deadlock to happen here...
					try {
						Thread.sleep(50);
					}catch (InterruptedException e) {
					
					}

					// Now wait 'till we can get a lock on resource 2
					synchronized (resource2) {

						while (true) {
							System.out.println("Thread 1: locked resource 2");

							try {
								Thread.sleep(10000);
							}catch (InterruptedException e) {
							}
						}
					}
				}
			}
		};

		// Here's the second thread. It tries to lock resource2 then resource1
		Thread t2 = new Thread() {

			public void run() {

				// This thread locks resource 2 right away
				synchronized (resource2) {
					System.out.println("Thread 2: locked resource 2");

					// Then it pauses, just like the first thread.
					try {
						Thread.sleep(50);
					}catch (InterruptedException e) {
					}

					// Then it tries to lock resource1. But wait! Thread 1
					// locked resource1, and won't release it 'till it
					// gets a lock on resource2. This thread holds the
					// lock on resource2, and won't release it 'till it
					// gets resource1. We're at an impasse(僵局). Neither
					// thread can run, and the program freezes up.
					
					synchronized (resource1) {
						System.out.println("Thread 2: locked resource 1");
					}
				}
			}
		};

		// Start the two threads. If all goes as planned, deadlock will occur, and the program will never exit.
		t1.start();
		t2.start();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章