上海-拼多多电商部二面(3)

简介: 上海-拼多多电商部二面(3)

17、什么是Future?


在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread 类还是实现 runnable 接口,都无法保证获取到之前的执行结果。通过实现 Callback接口,并用 Future 可以来接收多线程的执行结果。


Future 表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加 Callback 以便在任务执行成功或失败后作出相应的操作。


18、什么是 AQS


AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步状态。


AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask 等等皆是基于 AQS 的。


19 、AQS 支持两种同步方式:


(1)独占式


(2)共享式


这样方便使用者实现不同类型的同步组件,独占式如 ReentrantLock,共享式如 Semaphore,CountDownLatch,组 合 式 的 如 ReentrantReadWriteLock。总之,AQS 为使用提供了底层支撑,如何组装实现,使用者可以自由发挥。


20 、ReadWriteLock 是什么


首先明确一下,不是说 ReentrantLock 不好,只是 ReentrantLock 某些时候有局限。如果使用 ReentrantLock,可能本身是为了防止线程 A 在写数据、线程 B 在读数据造成的数据不一致,但这样,如果线程 C 在读数据、线程 D 也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。因为这个,才诞生了读写锁ReadWriteLock 。 ReadWriteLock 是 一 个 读 写 锁 接 口 , ReentrantReadWriteLock 是ReadWriteLock 接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。


21 、FutureTask 是什么


这个其实前面有提到过,FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。当然,由于 FutureTask 也是 Runnable 接口的实现类,所以FutureTask 也可以放入线程池中。


22 、synchronized 和 和 ReentrantLock 的区别


synchronized 是和 if、else、for、while 一样的关键字,ReentrantLock 是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比 synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock 比 synchronized 的扩展性体现在几点上


(1)ReentrantLock 可以对获取锁的等待时间进行设置,这样就避免了死锁


(2)ReentrantLock 可以获取各种锁的信息


(3)ReentrantLock 可以灵活地实现多路通知


另外,二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的 park 方法加锁,synchronized 操作的应该是对象头中 mark word,这点我不能确定。


23、什么是乐观锁和悲观锁


(1)乐观锁:


就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。


(2)悲观锁:


还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像 synchronized,不管三七二十一,直接上了锁就操作资源了。


24、线程 B 程 怎么知道线程 A 修改了变量


(1)volatile 修饰变量


(2)synchronized 修饰修改变量的方法


(3)wait/notify


(4)while 轮询


25 、synchronized 、volatile 、CAS 比较


(1)synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。


(2)volatile 提供多线程共享变量可见性和禁止指令重排序优化。


(3)CAS 是基于冲突检测的乐观锁(非阻塞)


26 、sleep 和 方法和 wait 方法有什么区别?


这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器,wait 方法会放弃这个对象的监视器。


27 、ThreadLocal 是什么?有什么用?


ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。简单说 ThreadLocal 就是一种以空间 换 时 间 的 做 法 , 在 每 个 Thread 里 面 维 护 了 一 个 以 开 地 址 法 实 现 的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。


28、为什么 wait()和 方法和 notify()/notifyAll() 方法要在同步块中被调用


这是 JDK 强制的,wait()方法和 notify()/notifyAll()方法在调用前都必须先获得对象的锁


29 、多线程同步有哪几种方法?


Synchronized 关键字,Lock 锁实现,分布式锁等。


目录
相关文章
|
Java
上海-拼多多电商部二面(1)
上海-拼多多电商部二面(1)
86 0
|
缓存 Java 调度
上海-拼多多电商部二面(2)
上海-拼多多电商部二面(2)
67 0
上海-拼多多电商部二面(2)
|
安全 算法 Java
上海-拼多多电商部二面(4)
上海-拼多多电商部二面(4)
120 0
|
新零售
农村淘宝、天猫小店、零售通、城市合伙人概念太多傻傻分不清,到底该怎么区别理解和加盟?
农村淘宝、天猫小店、零售通、城市合伙人概念太多傻傻分不清,到底该怎么区别理解和加盟?
325 0
农村淘宝、天猫小店、零售通、城市合伙人概念太多傻傻分不清,到底该怎么区别理解和加盟?
|
人工智能 算法 机器人
2019年春晚借深圳展现未来,你听到科技创新的时代最强音了吗?
2019年春晚借深圳展现未来,你听到科技创新的时代最强音了吗?
155 0
2019年春晚借深圳展现未来,你听到科技创新的时代最强音了吗?
如果马云不限制淘宝赢利,互联网营销
  在孙彤宇时代,马云便对淘宝下达过死命令——三年内不许赢利,那个时候淘宝刚刚在C2C领域占据了中国网购市场的大半份额,在这种情况下,马云提出“赢利超标高管要受处罚”就不再是向市场传达淘宝将继续培育市场、给市场更大信心这么简单了。
1118 0
|
新零售
阿里脱贫成绩单: 一年全国600多个贫困村成为淘宝村
“味道不错!”马云当场拿起一瓶“MA沙棘”,品了一口说。 这是1月10日在河北举行的阿里巴巴技术脱贫大会上。“MA沙棘”成为会上的网红产品,这种从沙棘果里提炼出来的饮料是维C之王,是阿里巴巴生态脱贫的产物,来自于蚂蚁森林上线的首个生态经济林。
1812 0
|
新零售 大数据
天猫国际又搞大事情!李宇春、华晨宇,“世界妙物”都来了
天猫国际联合30多家全球代表品牌在上海率先举办世界妙物纪,展出全球好货,是对平台引领全球品牌一起亮相中国国际进口博览会盛况的一次预演。
1860 0
“买买买”也可以做公益! 阿里巴巴“公益宝贝”为壹乐园筹款突破1亿
2018年8月1日,阿里巴巴“公益宝贝”为壹基金的公益项目“壹乐园”筹款突破了1亿元人民币。六年来,19亿人次消费者通过“公益宝贝”进行爱心捐赠,以举手之劳参与公益。在阿里巴巴公益、公益卖家、爱心买家的支持下,壹基金“壹乐园”公益项目六年来已帮助500万人次贫困儿童成长,在快乐中发展潜能。
2159 0