多线程-----多线程同步

多线程-----多线程同步

🍎姓名:洋葱爱代码🍎
🍊喜欢:Java编程🍊
🍉重要的事情说三遍!!!🍉
🍓欢迎大家来访问哦,互相学习🍓
🍋欢迎大家来访问哦,互相学习🍋
🍑欢迎大家来访问哦,互相学习🍑

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🍎合抱之木,生于毫末;百丈之台,起于垒土;千里之行,始于足下。------《老子》
🍊今日学习任务!!!!!
🍊 1、掌握多线程的同步

🔥一、开胃小菜阶段🍰

✨什么是多线程的同步✨
📊当多个线程去访问同一个资源时,也会引发一些安全问题。例如,当统计一个班级的学生数目时,如果有同学进进出出,则很难统计正确。为了解决这样的问题,需要实现多线程的同步,即限制某个资源在同一时刻只能被一个线程访问,

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🔥二、线程安全🍺

✨模拟窗口售票✨

package thread;
/*
 * 
 * 线程安全
 * 
 * 
 */
public class Main7 {
	public static void main(String[] args) {
		taskWindow d7 = new taskWindow();
		new Thread( d7 , "一号售票厅").start();
		new Thread( d7 , "二号售票厅").start();;
		new Thread( d7 , "三号售票厅").start();;
		new Thread( d7 , "四号售票厅").start();;



	}



}

class taskWindow implements Runnable{
	private int tickets = 10 ;
	@Override
	public void run() {
		while (tickets > 0 ) {
			try {
				//休眠1秒钟
				Thread.sleep(1000);
			}catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+ "---卖出票"+ tickets--);
		}
		
	}
	
	
}

在这里插入图片描述

✨为什么这个一号售票厅竟卖到了-1张票,这很离谱啊✨

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🔥三、同步代码块🍺

✨引言✨
❤要想解决上面的问题, 必须保证下面用于处理共享资源的代码在任何时刻只能有一个线程访问
💡为了实现这种限制,Java中提供了同步机制,当多个线程使用同一个共享资源时,可以将处理共享资源的代码放在一个使用synchronized关键字来修饰的代码块中,这个代码块被称为同步代码块,其语法格式如下:

在这里插入图片描述

🔦上面的代码,lock是一个锁对象,它是同步代码块的关键。当某一个线程执行同步代码夸时,其它线程将无法执行当前同步代码块,会发生阻塞,等当前线程执行完同步代码块后,所有线程开始抢夺线程的执行权,抢到执行权的线程将进入同步代码块,执行其中的代码。循环往复,直到共享资源被处理完为止。这个过程就好比一个公共电话亭,只有一个人打完电话出来后,后面的人才可以打。

package thread;
/*
 * 
 * 线程安全
 * 
 * 
 */
public class Main7 {
	public static void main(String[] args) {
		taskWindow d7 = new taskWindow();
		new Thread( d7 , "四号售票厅").start();
		new Thread( d7 , "一号售票厅").start();
		new Thread( d7 , "二号售票厅").start();
		new Thread( d7 , "三号售票厅").start();
		

	}
}

class taskWindow implements Runnable{
	private int tickets = 10 ;
	Object lock = new Object();
	@Override
 	public void run() {
		while(true) {
				synchronized (lock) {
						try {
							//休眠1秒钟
							Thread.sleep(100);
						}catch (InterruptedException e) {
							e.printStackTrace();
						}
						if(tickets > 0 ) {
							System.out.println(Thread.currentThread().getName()+ "还有" + tickets+"张票"+ "---卖出一张票," +"还剩下" + --tickets);
						}else {
							break;
						}
				}
		}
	}
		
	}


在这里插入图片描述

🌟为了方便操作,在方法前面加上synchronized关键字来修饰,被修饰的方法为同步方法,它能实现和同步代码块同样的功能,具体语法:在这里插入图片描述
🌟被synchronized修饰的方法在某一刻只允许一个线程访问,访问该方法的其他线程会发生阻塞,直到当前线程访问完毕后,其他线程才有机会执行该方法。

package thread;
/*
 * 
 * 线程安全
 * 
 * 
 */
public class Main8 {
	public static void main(String[] args) {
		taskWindow1 d7 = new taskWindow1();
		new Thread( d7 , "四号售票厅").start();
		new Thread( d7 , "一号售票厅").start();
		new Thread( d7 , "二号售票厅").start();
		new Thread( d7 , "三号售票厅").start();
		

	}
}

class taskWindow1 implements Runnable{
	private int tickets = 10 ;
	@Override
 	public synchronized void run() {
		while(true) {
		
						try {
							//休眠1秒钟
							Thread.sleep(100);
						}catch (InterruptedException e) {
							e.printStackTrace();
						}
						if(tickets > 0 ) {
							System.out.println(Thread.currentThread().getName()+ "还有" + tickets+"张票"+ "---卖出一张票," +"还剩下" + --tickets);
						}else {
							break;
						}
				
		}
	}
		
	}


在这里插入图片描述
在这里插入图片描述
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🔥四、死锁🔒

在这里插入图片描述

🌟 🌟
❤结果可想而知,两个人都吃不到饭。这个例子中的两个人可以看作两个线程,筷子和刀叉就相当于锁。
❤两个线程在运行时都在等待对方的锁,这样就会造成程序的停滞,这种现象称为死锁。
想想怎么实现代码吧

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🔥五、每日一夸🎖

🍑每日一夸!!!
🍑就如同薛之謙对毛不易夸奖的
🍑"你现在就是流星" , 但是我相信你 ,你坚持下去你就是巨星"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋葱爱代码

互相学习,互相进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值