并发篇-面试题解析
创始人
2025-05-28 02:13:17

1.sleep和wait

  1.1 共同点

  1. wait(),wait(long),sleep(long) 的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态

  1.2  不同点

  1. 方法归属不同: sleep(long)是Thread类的静态方法;wait()和wait(long)都是Object类的成员方法
  2. 苏醒的机制不同:sleep(long)只能等待时间结束后苏醒;wait(),必须被notify()或notifyAll()唤醒,否则一直等待;wait(long)可以等待时间就结束后苏醒,也可以通过notify()或notifyAll()唤醒
  3. 锁特性不同:sleep在synchronized代码块中执行,并不会释放对象锁;wait方法调用必须先获取wait对象的锁,执行后会释放对象锁,允许其他线程获取对象锁

2.lock和synchronuzed 

   2.1  语法层次

  1. synchronized是关键字;
  2. lock是接口,创建其对象的时候需要通过其实现类创建
  3. 使用synchronized时,退出同步代码块锁会自动释放,而lock需要调用unlock方法释放锁

   2.2  功能层次

  1. 二者都是悲观锁,都具备基本的互斥,同步,锁重入功能
  2. lock具备等待状态,公平锁,可打断,可超时等功能

3. 保证线程安全的三个方面

  1. 可见性:一个线程对共享变量修改,另外一个线程可以看到最新的结果
  2. 有序性:一个线程内代码按编码顺序执行
  3. 原子性: 一个线程内多行代码以一个整体运行,期间不能有其他线程的代码插队

4.volatile能否保证线程安全

  1. volatile可以保证共享变量的可见性与有序性,但是不能保证原子性 ,所以无法保证线程安全

5.Volatile与Synchronized比较

  1. Volatile是轻量级的synchronized,因为它不会引起上下文的切换和调度,所以Volatile性能更好。
  2. Volatile只能修饰变量,synchronized可以修饰方法,静态方法,代码块。
  3. Volatile对任意单个变量的读/写具有原子性,但是类似于i++这种复合操作不具有原子性。而锁的互斥执行的特性可以确保对整个临界区代码执行具有原子性。
  4. 多线程访问volatile不会发生阻塞,而synchronized会发生阻塞。
  5. volatile是变量在多线程之间的可见性,synchronize是多线程之间访问资源的同步性。

6.悲观锁和乐观锁

  6.1 悲观锁

  1.  悲观锁的代表是synchronized和lock锁
  2. 核心思想:线程只有占用了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取失败的锁,都得停下来等待
  3. 线程从运行到阻塞,再从阻塞到唤醒,涉及到线程上下文切换,耗费性能

   6.2  乐观锁

  1. 代表是:AtomicInteger
  2. 核心思想:无需加锁,每次只有一个线程能成功修改共享变量,其他失败的线程不需要停止,不断重复尝试
  3. 由于线程一直运行,不涉及到线程上下文切换,无性能耗费

相关内容

热门资讯

上海出发3天2晚私家团,婺源三... 上海出发3天2晚私家团,婺源三清山望仙谷,一次解锁江西顶流玩法! 是不是觉得,想找个地方彻底放松几天...
“东湖花里”年宵花市启幕,就在... 新春佳节,东湖绿道楚风园“东湖花里”年宵花市今起绽放,以满园春色与盎然生机,为市民游客奉上一场可观、...
名义雇主EOR-中企出海乌干达... 名义雇主EOR:中企出海乌干达生活篇之交通出行 乌干达作为非洲东部的重要国家,近年来吸引了越来越多的...
二〇二六年“欢乐春节”系列活动... 马年春节的脚步越来越近,中国的城市乡村早已溢满年味,“欢乐春节”系列活动也在海外开展得有声有色。“欢...
这个春节,戴上骑行AR眼镜,开... 西安城墙,是全球现存规模最宏大、保存最完整的古代城垣之一。如今,骑行漫游其上,已成为海内外游客解码长...