多线程同步异步-复习

一、线程执行概览

一个Thread,被new一次就创建了一个新线程。
每个线程的共有资源是此线程对象持有的对象,如下图的thread-a/thread-b/thread-c调用single对象的方法,即持有single对象资源,这是共有的。
每个线程有自己的方法栈,各自执行,就是异步,需要协同执行就是同步。
在这里插入图片描述
同步 中文含义上,同步是指步调一致,听上去给人感觉是一起做的事情。但是在程序中却是另一回事,同步却不同时。还是拿栈来看,一个线程对应一个栈。但如果方法里的某个步奏是需要一个个完成的,就叫同步了。进入了同步代码的临界点后,你不能乱跑,要跟着先走的线程走。走在你前面的线程就是相对线程啦。
(区分同步和齐步的意思,同步是相对的,齐步是同时进行滴)

二、加锁实现同步

对象锁、类锁、死锁、可见性
对对象加锁
在被持有对象(共享对象)中定义同步语句,如single对象,而不是在线程对象中定义。除非线程对象中有共享的属性。
1.同步语句块

functionName(){
   synchronized(对象){
	   //语句块
   }
}

2.同步方法:

 synchronized functionName(){
   //方法体
  }

对类加锁

synchronized(X.class)

与对对象加锁不同的是,多个线程同时访问同一个对象会产生同步效果;而对类加上,多个线程访问一个对象不会产生同步,只是访问静态方法才产生同步。

1. 死锁 不是一种锁,而是一种被扣紧无法动弹的状态,所以叫死锁。 线程互相持有对方所需资源,都不释放而一直等待

2.可见性
使用volatile关键字,可以及时读取线程操作的内存的值。
例:a++这个操作不是cpu的原子操作,而是有一系列流程:read->load->->use->asign->store->write。
在这里插入图片描述

以下是其他线程读取的结果:
在这里插入图片描述
线程执行一句话的内存模型如下:
在这里插入图片描述
线程少竞争小的时候,看不出差异,这里创建10万个线程同时对共享变量count加1,最终得到的结果是99851;count添加volatile关键字后,得到的结果是99999.更接近预期值,但是还是有误差,也就是无法保证原子性。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值