黑马程序员——多线程(二)

---------------------- android培训java培训、期待与您交流! ----------------------

多线程(二)

    单例设计模式的两种方式:

 

//饿汉式:

class  Single 
{
	private Single() {
	}
	
	private static Single single = new Single();

	public static Single getInstance() {
		return single;
	}


 

//懒汉式

/*

特点:延迟加载。多线程访问时存在安全问题,可以添加同步代或同步代码块,但是比较低效;利用双重判断可以解决效率问题。

*/

class Single 
{
	private Single() {
	}

	pivate static Single single = null;

	public static Single getInstance() {
		if(single == null){
			synchronized(Single.class) {//此处的锁是该类的字节码文件对象

				if(single == null) {
					single = new Single(); 
				}
			}
			return single;
		}
	}
		
}


 

死锁:

 

多线程可能产生死锁如:在同步代码块中调用同步函数,又在同步函数中使用同步代码块

class DeadLock implements Runnable  
{
	
	private boolean flag;
	DeadLock(boolean falg) {
		
		this.flag = flag;
	}

	public void run() {
		if (flag==true)
		{
			synchronized(MyLock.obj1) {
				System.out.println(Thread.currentThread().getName()+"if obj1");
				synchronized(MyLock.obj2) {
					System.out.println(Thread.currentThread().getName()+"if boj2");
				}
			}
			
		}
		else {
			synchronized(MyLock.obj2) {
				System.out.println(Thread.currentThread().getName()+"else obj2");
				synchronized(MyLock.obj1) {
					System.out.println(Thread.currentThread().getName()+"else obj1");
				}
			}
		}

	}

}

public class DeadLockDemo
{
	public static void main(String[] args) {
		DeadLock dl1 = new DeadLock(true);
		DeadLock dl2 = new DeadLock(false);

		Thread t1 = new Thread(dl1);
		Thread t2 = new Thread(dl2);
		t1.start();
		t2.start();
	}
}

class MyLock
{
	static Object obj1 = new Object();
	static Object obj2 = new Object();
}


 

线程之间的通信:

多个线程操作同一个资源,但是操作动作不同。

class  InputOutputDemo
{
	public static void main(String[] args) 
	{
		Resource res = new Resource();
		Input in = new Input(res);
		Output ou = new Output(res);
		Thread t1 = new Thread(in);
		Thread t2 = new Thread(ou);
		t1.start();
		t2.start();
	}
}

class Resource 
{
	 String name;
	 int  age;

}

class Input implements Runnable 
{
	private Resource res;
	public Input(Resource res) {
		this.res = res;
	}
	public void run() {
		boolean flag = true;
		while(true) {
			if(flag){
				res.name = "maike";
				res.age = 10;
			}
			else{
				res.name = "史密斯";
				res.age = 20;
			}
			flag = !flag;
		}
			
		
	}
}

class Output implements Runnable 
{
	private Resource res;
	public Output(Resource res) {
		this.res = res;
	}
	public void run() {
		while(true)
		System.out.println(res.name +"///"+ res.age);
		
	}
}


 

以上代码的运行会有安全问题,name age 的存取不进行同步就会出现不一致的情况。解决方法是对Input类中run方法中的name 和age 同步以及Output类中run方法的打印语句同步即可。

 

 

 ---------------------- android培训java培训、期待与您交流! ----------------------

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值