多线程可能遇到的技术问题

发表时间:2017-09-01 17:10:48 浏览量( 20 ) 留言数( 0 )

学习目标:

1、展示一下多线程安全性的一些例子。

2、线程的死锁的例子。


学习过程:

    这节课还是多做做实验,比如上一节课线程安全性问题的例子,死锁的例子,那么这里实例大家都应该要会掌握的

写一个死锁的例子,写一个线程安全的例子,并分析。

线程安全性的问题:

两个线程对同一个对象的变量执行++的操作,都是加到1000为止,最后的结果时2000吗,多运行几次,看看是不是都是等于2000.

public class Run3 {

	public static void main(String[] args) throws InterruptedException {
		Num num = new Num();//同一对象,每个对象执行加1000的操作。那么最后的结果会是两千吗
		ThreadA threadA = new ThreadA(num);
		ThreadB threadB = new ThreadB(num);
		threadA.start();
		threadB.start();
		Thread.sleep(200);
		System.out.println(num.count);
	}
}

class ThreadA extends Thread {
	private Num num;

	public ThreadA(Num num) {
		this.num = num;
	}

	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			num.count++;
		}
	}
}

class ThreadB extends Thread {
	private Num num;

	public ThreadB(Num num) {
		this.num = num;
	}

	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			num.count++;
		}
	}
}

class Num {
	int count = 0;

	public Num() {
	}
}


有的时候结果如下:

attcontent/fa6a1c79-05d2-480a-a457-1f18ae52127b.png


两个线程需要锁住两个对象才能进行下面的操作,多运行几次,看看是不是每一次都能正常的退出应用程序的,代码如下:

public class Run4 {

	public static void main(String[] args) throws InterruptedException {
		
		
		Object obj1=new Object();
		Object obj2=new Object();
		
		
		Thread4A threadA = new Thread4A(obj1,obj2);
		Thread4B threadB = new Thread4B(obj2,obj1);
		threadA.start();
		threadB.start();
		
		
	}
}

class Thread4A extends Thread {
	private Object obj1;
	private Object obj2;

	public Thread4A(Object obj1,Object obj2) {
		this.obj1=obj1;
		this.obj2=obj2;
	}

	@Override
	public void run() {
		synchronized (obj1) {
			System.out.println("我锁住了obj1了");
			synchronized (obj2) {
				System.out.println("我锁住了obj2了");
			}
			
		}
		
		System.out.println("Thread4A结束了。");
	}
}

class Thread4B extends Thread {
	private Object obj1;
	private Object obj2;

	public Thread4B(Object obj1,Object obj2) {
		this.obj1=obj1;
		this.obj2=obj2;
	}

	@Override
	public void run() {
		synchronized (obj1) {
			System.out.println("我锁住了obj1了");
			synchronized (obj2) {
				System.out.println("我锁住了obj2了");
			}
		}
		System.out.println("Thread4B结束了。");
	}
}