线程同步处理(为什么卫生间要装把锁问题的思考)

金贡和小天一起上去厕所(单人卫生间),小天先进去了,金贡一来也要上厕所,如果此时没锁门的话,金贡进去,阿西吧**********(此处省略300字),小天换裤子去了。若是此时小天把门锁上了,金贡换裤子去了。所以,卫生间装把锁是多么重要的事情啊。

锁:当一个线程执行操作的时候其他线程外面等待。
synchronized就是这个锁。

一.同步代码快.

synchronized(同步对象){
	同步代码操作;
}

class MyThread2 implements Runnable{
	private int ticket=10;
	@Override
	public void run() {
		synchronized (this) {//上锁
			while(true){
				if(this.ticket>0){
					try {
						Thread.sleep(100);          //模拟网络延迟
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"+卖票,ticket="+this.ticket--);
				}else{
					System.out.println("*******票已被抢光*******");
					break;
				}
			}
		}
	}
}

public class ThreadDemo1 {
	public static void main(String[] args) throws InterruptedException{
		MyThread2 mt=new MyThread2();
		new Thread(mt,"票贩子A").start();
		new Thread(mt,"票贩子B").start();
		new Thread(mt,"票贩子C").start();
	}
}
 
票贩子A+卖票,ticket=10
票贩子A+卖票,ticket=9
票贩子A+卖票,ticket=8
票贩子A+卖票,ticket=7
票贩子A+卖票,ticket=6
票贩子A+卖票,ticket=5
票贩子A+卖票,ticket=4
票贩子A+卖票,ticket=3
票贩子A+卖票,ticket=2
票贩子A+卖票,ticket=1	
*******票已被抢光*******
*******票已被抢光*******
*******票已被抢光*******

二.同步方法


class MyThread2 implements Runnable{
	private int ticket=10;
	
	public synchronized boolean sale(){
		if(this.ticket>0){
			try {
				Thread.sleep(100);          //模拟网络延迟
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			System.out.println(Thread.currentThread().getName()+"+卖票,ticket="+this.ticket--);
			return true;
		}else{
			System.out.println("*******票已被抢光*******");
			return false; 
		}
	}
	
	@Override
	public void run() {
		synchronized (this) {//上锁
			while(this.sale()){
				this.sale();
			}
		}
	}
}

public class ThreadDemo1 {
	public static void main(String[] args) throws InterruptedException{
		MyThread2 mt=new MyThread2();
		new Thread(mt,"票贩子A").start();
		new Thread(mt,"票贩子B").start();
		new Thread(mt,"票贩子C").start();
	}
}
 

两种方法结果一样。
加入同步之后会造成性能的降低。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值