您的位置:首页 > 其它

关于线程的一点补充

2013-05-20 19:47 176 查看
一、线程同步:

当两个或两个以上的线程同时访问一个资源。为了保护资源数据的安全,要求在同一时间只能一个线程访问该资源。

同步造成的结果:1、数据安全 2、效率低下。

二、线程死锁:

当两个线程循环依赖于一对同步对象时将发生死锁。例如:

一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何synchronized方法,就将发生死锁。

死锁很少发生,但一旦发生就很难调试。

三、线程状态:



四、



五、



示例:

package java_520_1314;

public class TestSynchronized {
	public static void main(String[] args) {
		MyObj obj = new MyObj();
		OneThread one = new OneThread(obj);
		TwoThread two = new TwoThread(obj);

	}
}

class MyObj {
	public boolean isRun = true;
}

class OneThread extends Thread {
	private MyObj obj;

	public OneThread(MyObj obj) {
		this.obj = obj;
		this.start();
	}
	public void run() {
		while (true) {
			// 同步块,当前线程对obj进行同步
			synchronized (obj) {
				if (obj.isRun == true) {
					System.out.print("AA");
					obj.isRun = false;
					// 唤醒下一个线程访问obj资源
					obj.notify();
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					try {
						// 当前线程相对obj对象进行等待
						obj.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}

class TwoThread extends Thread {
	private MyObj obj;

	public TwoThread(MyObj obj) {
		this.obj = obj;
		this.start();
	}
	public void run() {
		while (true) {
			synchronized (obj) {
				if (obj.isRun == false) {
					System.out.print("B");
					obj.isRun = true;
					// 唤醒下一个线程访问obj资源
					obj.notify();
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					try {// 当前线程相对obj对象进行等待
						obj.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: