多线程原理分析

1.多线程的目的
(1).在多个CPU核心下,多线程的好处是显而易见的,不然多个CPU核心只跑一个线程其他的核心就都浪费了;
(2).即便不考虑多核心,在单核下,多线程也是有意义的,因为在一些操作,比如IO操作阻塞的时候,是不需要CPU参与的,这时候CPU就可以另开一个线程去做别的事情,等待IO操作完成再回到之前的线程继续执行即可.

2.多线程对于共享变量访问带来的安全性问题
一个对象是否是线程安全的,取决于它是否会被多个线程访问,以及程序中是如何去使用这个对象的。
如果多个线程访问同一个共享对象,在不需额外的同步以及调用端代码不用做其他协调的情况下,这个共享对象的状态依然是正确的(正确性意味着这个对象的结果与我们预期规定的结果保持一致),那说明这个对象是线程安全的。

3.在 Java 中如何解决由于线程并行导致的数据安全性问题
加锁。
Java 提供的加锁方法就是 Synchroinzed 关键字

4.synchronized
(1). 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
(2). 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
(3). 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
不同的修饰类型,代表锁的控制粒度

5.锁是如何存储的
对象在内存中的存储布局,可以分为三个区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)
当某个对象被synchronized 关键字当成同步锁时,那么围绕这个锁的一系列操作都和 Mark word 有关系,
Mark Word 里面存储的数据会随着锁标志位的变化而变化

6.为什么任何对象都可以实现锁
(1).Java 中的每个对象都派生自 Object 类,而每个Java Object 在 JVM 内部都有一个 native 的 C++对象 oop/oopDesc 进行对应。
(2).线程在获取锁的时候,实际上就是获得一个监视器对象(monitor) ,monitor 可以认为是一个同步对象,所有的 Java 对象是天生携带 monitor。
多个线程访问同步代码块时,相当于去争抢对象监视器修改对象中的锁标识.

7.synchronized 锁的升级
使用锁能够实现数据的安全性,但是会带来性能的下降。
不使用锁能够基于线程并行提升程序性能,但是却不能保证线程安全性。
JDK1.6 之后做了一些优化,为了减少获得锁和释放锁带来的性能开销,引入了偏向锁、轻量级锁的概念。
 synchronized 中,锁存在四种状态,分别是:无锁、偏向锁、轻量级锁、重量级锁; 
锁的状态根据竞争激烈的程度从低到高不断升级

举例理解:
A和B的消化系统速度快慢可能不一样,两个人都要上同一个厕所:
(1).A一天要上很多次厕所,B一天可能就上一次厕所,这个时候它们争抢共享资源“厕所”,就是偏向锁,偏向于A;
(2).A和B上厕所的频率差不多,但是两个人的时间不冲突,交替上厕所 ,此时 就是轻量级锁;
(3).A和B上厕所的时间一致,同时上厕所就有冲突,此时 就是重量级锁;

8.Synchronized 结合 Java Object 对象中的 wait,notify,notifyAll
被阻塞的线程什么时候被唤醒,取决于获得锁的线程什么时候执行完同步代码块并且释放锁。
那怎么做到显示控制呢?我们就需要借助一个信号机制:在 Object 对象中,提供了 wait/notify/notifyall,可以用于控制线程的状态。
wait:表示持有对象锁的线程 A 准备释放对象锁权限,释放 cpu 资源并进入等待状态。
notify:表示持有对象锁的线程 A 准备释放对象锁权限,通知 jvm 唤醒某个竞争该对象锁的线程 X。
线程 A synchronized 代码执行结束并且释放了锁之后,线程 X 直接获得对象锁权限,其他竞争线程继续等待。
(即使线程 X 同步完毕,释放对象锁,其他竞争线程仍然等待,直至有新的 notify ,notifyAll 被调用)
notifyAll:notifyall 和 notify 的区别在于,notifyAll 会唤醒所有竞争同一个对象锁的所有线程。
当已经获得锁的线程 A 释放锁之后,所有被唤醒的线程都有可能获得对象锁权限。
三个方法都必须在 synchronized 同步关键字所限定的作用域中调用,否则会报错 java.lang.IllegalMonitorStateException ,意思是因为没有同步,所以线程对对象锁的状态是不确定的,不能调用这些方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值