Synchronized和volatile关键字的作用以及线程都相关知识点

#### Synchronized和volatile关键字的作用

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰后,就具备了两层含义:

- 保证了不同线程对这个变量进行操作时都可见性,即一个线程修改了某个共享变量的值,这个新值对其他线程来说是立即可见的
- 禁止进行指令重排序。volatile的本质是在告诉JVM当前变量在寄存器(工作内存)中都值是不确定的,需要从主存中读取

| 比较点 | Synchronized | volatile |

Synchronizedvolatile
使用级别 可以使用在变量、方法、类级别 只能使用在变量级别
能否保证变量都原子性 可以保证变量都修改可见性和原子性 只能保证变量修改都可见性、不能保证原子性
能否造成线程阻塞 不能
会不会被编译器优化 不会

说说对线程池的了解

- 降低资源消耗。通过重复利用已经创建都线程降低线程创建和线程销毁造成的损耗
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行
- 提高线程的可管理性。线程是稀缺资源,如果无限制都创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一都分配、调优和监控

什么情况下导致线程的死锁,遇到线程死锁怎么解决?

1. 死锁都定义:死锁是指多个线程因竞争资源而造成都一种僵局、若无外力作用,这些线程都将无法向前推荐
2. 产生死锁都必要条件
- 互斥条件:线程要求对所分配都资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时如有其他线程请求该资源,则请求线程只能等待
- 不剥夺条件。线程所获的都资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源都线程自己来释放
- 请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他线程占有,此时请求线程被阻塞,但对自己已经获得的资源保持不放
- 循环等待条件:存在一种线程资源的循环等待链,链中都每一个线程已经获得都资源同时被链中下一个线程所请求
3. 如何避免死锁
1. 加锁顺序(线程按照一定都顺序加锁)
2. 加锁时限(线程尝试获取锁的时候加上一定都时间限制,超过限制则放弃对该锁都请求,并释放自己占有都锁)

java中多线程之间都通信如何实现?

1. 共享变量:线程间通信可以通过发送信号,发送信号的一个简单方式是在共享对象都变量里设置信号值
2. wait/notify机制:以资源为例,生产者生产一个资源,通知消费者就消费掉一个资源,生产者继续生产资源,消费者消费资源,以此循环。

请说出同步线程及线程调度都相关方法

方法说明
wait() 使得一个线程进入等待状态(阻塞),并且释放所持有的锁
sleep() 使一个正在运行都线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常
notify() 唤醒一个处于等待状态都线程,在调用此方法后,并不能确定回唤醒哪个等待的线程,是由JVM来确定,与优先级无关
notifyAll() 唤醒所有处于等待状态都线程,该方法比较并不是将对象都锁给所有线程,而是让他们竞争,只有获取锁的线程才能进入就绪状态
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章