线程同步

1.线程同步
处理多线程同时运行的问题。
多线程同时操作同一对象的数据,将会形成对自己操作的数据不同步的情况。
如银行取款问题:
当用存折和银行同时取钱时,会执行怎样的结果?
如下列代码:
public class Account {
	//额度属性
	private int count;
	public Account(int count){
		this.count = count;
	}
	//取现的流程
	public int getCash(int cash){
		
			//1.验证额度是否足够取现
			if(count<cash){
				//取现失败
				return -1;
			}
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			//扣除额度
			count = count - cash;
		}
		return count;
	}
}



一般我们在初学时可能会使得两者同时取钱都会成功。就是说,如果在银行总共存了三百,然而你却在卡和存折同时各取二百,最终结果显然不合常理。这是由于CPU在运行进程1时同时运行了进程2,导致同时运行。而且在扣除额度时,1还未扣除,2就已经运行扣除。
此时,使用同步锁synchronized来解决问题,同步锁是在运行进程1时将变为0,直到运行完才变为1,在这期间将不会有其他进程访问。




2.wait/notify
这是一个等待,一个通知。当在一个对象上调用wait()方法是,当前线程会进入wait状态,直到收到另一个对象notify发出的通知,才会执行下一步计划。


如生产-消费模型


public class CustomerThread extends Thread {
	// 仓库
	private ArrayList<IPhone7> list;

	public CustomerThread(ArrayList<IPhone7> list) {
		this.list = list;
	}

	public void run() {
		// 不停地执行生产操作
		while (true) {
			synchronized (list) {
				if (list.size() ==0) {
					try {
						list.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				// 生产一个手机
				IPhone7 iphone = list.remove(0);
				System.out.println("消费者从仓库中取出了一个手机,型号为:"+iphone.name);
				list.notify();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
在这之中,wait时CPU不进行任何操作,就避免其他情况下CPU运行超载,。只有notify运行发出通知是,CPU才运作。


3.线程的生命周期
当线程创建时,点击就绪,进入就绪状态,CPU运行时开始运行,使用run方法;run释放,线程结束。如果线程在中途sleep的话就睡眠,睡眠完毕进入就绪状态,然后在运行等待CPU回来。如果线程等待,就会释放CPU;阻塞时就是进行同步锁。阻塞结束,就再次回到就绪状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值