java多线程学习笔记(三)

news/2024/5/20 14:06:37 标签: java, 多线程, 状态, 同步锁, 死锁

一、线程简介

请看:https://blog.csdn.net/qq_33157666/article/details/103949005

二、线程状态

请看:https://blog.csdn.net/qq_33157666/article/details/103949045

三、线程同步

 为什么要进行线程同步?

 java允许多线程并发控制,当多个线程同时操作一个可共享资源变量时(如对其进行增删改查操作),会导致数据不准确,而且相互之间产生冲突。所以加入同步锁以避免该线程在没有完成操作前被其他线程调用,从而保证该变量的唯一性和准确性。

3.1初识并发问题

//多个线程同时操作同一个对象
//买火车票的例子

//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据混乱
public class TestTheard4 implements Runnable{
	//票数
	private int ticketNumbers=10;

	@Override
	public void run() {
		while(true){
			if(ticketNumbers<=0){
				break;
			}
			System.out.println(Thread.currentThread().getName()+"--->拿到了"+ticketNumbers--+"票");
		}
	}
	

	public static void main(String[] args) {
		TestTheard4 testTheard4=new TestTheard4();
		new Thread(testTheard4,"小明").start();
		new Thread(testTheard4,"小张").start();
		new Thread(testTheard4,"黄牛党").start();
		
	}
}

可以看到小明和小张同时拿到了第9张票,这样线程是不安全的,需要做到同步,可以把同步理解成排队,不让多个线程操作同一个对象。可使用synchronized关键字实现同步。

引起线程不安全的原因:

每个线程的内存都是独立的,当两个线程同时访问一个对象时,会把对象复制到自己内存中,所以,如果想线程安全需要排队。

3.2 同步方法

同步方法:用synchronize关键字修饰的方法,当用synchronize关键字修饰方法时,一个线程持有锁后将其他需要此锁的线程挂起。

   代码修改:将4.1代码的run方法改为:

@Override
	public synchronized void run() {

3.3同步代码块

同步代码块:就是拥有synchronize关键字修饰的语句块

代码修改:将4.1代码的

@Override
	public void run() {
		while(true){
			synchronized (this) {
			if(ticketNumbers<=0){
				break;
			}
			System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNumbers--+"票");
			}
		}
	}

3.4小结

synchrionized实现同步的原理:

synchronized方法控制对象访问,每个对象对应一个把锁,每个synchized方法必须获得调用对象该对象的锁才能执行,否则会线程阻塞,方法一旦执行,就独占改锁,知道该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,持续执行。

使用synchronized的缺点:

  • 一个线程持有所会导致其他需要此锁的线程挂起,在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题;
  • 如果有一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题。

四、死锁

请看:https://blog.csdn.net/qq_33157666/article/details/103949174


http://www.niftyadmin.cn/n/1513696.html

相关文章

java多线程学习笔记(四)

一、线程简介 请看&#xff1a;https://blog.csdn.net/qq_33157666/article/details/103949005 二、线程状态 请看&#xff1a;https://blog.csdn.net/qq_33157666/article/details/103949045 三、线程同步 请看&#xff1a;https://blog.csdn.net/qq_33157666/article/de…

ASP.net下大文件上传的几个问题讨论

我研究这个问题已经很长时间了&#xff0c;ASPUpload的组件以及其它几个组件都使用过&#xff0c;多多少少对这些组件的工作原理有些了解&#xff0c;对于其它一些问题的讨论也都遇到过。前几个星期开发的WebbUpload2.0经过一段时间的测试后&#xff0c;发现它完全是一个超级大…

基于Arduino控制伺服电机(舵机)

一&#xff0c;串口监视器的应用 运用到的函数与关键字有&#xff1a;setup,loop,begin,println,print,available,parselnt. 其中begin&#xff0c;avaliable属于Serial库中的库函数&#xff0c;调用格式为 库函数名.需要调用的函数。 setup:只执行一次&#xff0c;ardu…

求解(暂放.net主页,谢谢支持)

近来一直做p2p直播项目&#xff0c;目前第一个版本已经接近尾声&#xff0c;基本功能也已经基本完成&#xff0c;忽然产品目标的主管要求在视频播放里面加一个广告链接&#xff0c;就是在视频播放的时候&#xff0c;用户点击播放器的视频画面后自动打开IE窗口连接到指定的网站&…

基于arduino的多个舵机控制

一&#xff0c;setup与外部 首先你想使用舵机就需要去调用arduino ide的Servo这个库函数&#xff0c;第二步定义你的舵机名称采用Servo 舵机名称&#xff0c;我这里有4个舵机就定义了四个。 接下来是setup函数的部分&#xff0c;依旧采用舵机名称.attach()&#xff0c;用来告诉…

备战蓝桥杯day1__LED跑马灯

51单片机于大多数单片机不同&#xff0c;在点亮LED时不是仅仅输出一个高电平就可以解决&#xff0c;需要经过一个74HC138译码器&#xff0c;一个74HC573锁存器。 一&#xff0c;74HC138译码器 有6个输入端口但是我们只需要关注A&#xff0c;B&#xff0c;C端口&#xff0c;由…

备战蓝桥杯day2__蜂鸣器与继电器

一&#xff0c;元件介绍 1&#xff0c;继电器 当继电器中间的线圈导通时&#xff0c;电生磁把K1吸下来&#xff0c;与m2连接&#xff0c;不导通时K1与m1连接&#xff0c;当继电器工作时&#xff0c;继电器旁边的LED会亮起。我们通过控制N BELAY端口来控制继电器是否工作&…

备战蓝桥杯day3__数码管静态显示

一&#xff0c;元件介绍 数码管分共阴和共阳&#xff0c;com端用于控制哪个数码管亮&#xff0c;而a&#xff0c;b&#xff0c;c等控制数码管的段码&#xff0c;共阳数码管及段码对应的端口为低电平时&#xff0c;则亮起&#xff0c;共阴与其相反。 二&#xff0c;代码部分 …