作为一个android开发者的我来说,面试最怕问的问题就是问多线程方面的,问之必死~~。因为android monkey在开发中多线程开发的场景使用起来几乎没有,所以就滋生了自己的懒惰性,人家说哪里跌倒哪里爬起来,这工作几年了也没爬起来,有点小羞愧。于是准备抽点时间好好研究下这个东东。 不要逼我,逼急了我什么都能做出来! 来来来,现场手写一个自旋锁出来试试!卒!
在多线程的编程中,如果需要加锁的情况下,通常需要synchronized来搞定(当然这是最初级的用法)用来确保线程安全,比如HashTable这个在开发中没怎么用过的组件,看其源码可以发现其public方法都加了synchronized来搞定;所以说HashTable是线程安全的。
在我们处理多线程并发的时候可能会经常这么写(这也是wait和notify notify All的正确使用姿势):
Object lock = new Object();
synchronized (lock) {
while (condition is not ok) { // 条件不满足,当前线程阻塞等待
lock.wait();
}
// 执行条件满足时的逻辑
doSomething();
// 通知阻塞的线程可以唤醒
lock.notify();
}
简单举一个例子来说明,以前博主面试遇到过这个问题:两个线程交替打印奇数和偶数。 思路也很简单,因为是线程交替执行,所以当前数字是偶数的时候就让奇数线程wait,当前数字是奇数的时候就让偶数线程wait
打印奇数的线程
private Object lock = new Object();
private int i = 0;
// 打印奇数
class PrintOdd implements Runnable {
@Override
public void run() {
synchronized (lock) {
while (i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?