BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #59194同步于 2018/5/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【问题】如何用数组实现一个线程安全的栈?

Enzyme
2018/5/16镜像同步23 回复
「更新」: 目前得到的方案应该是在声明 top 的时候使用原子类就可以解决了。 或者是借鉴 ConcurrentHashMap 的实现,真的好像。。。将 top 声明为 volatile, 这样写线程对 top 的改变不影响其他并发读线程获取 top 值;其他结构性的修改方法 直接加锁就可以了。 这两种方案应该是 前者的效率会更高一些。具体为啥,我也不知道。。。 -------------- 前几天面试问到的一个问题,我当时想的是给 pop push 之类的操作加上 对象锁 就行了。 但是感觉应该不是很好,数组使用 top 来维护当前栈顶的元素位置。这个 top 是否可以用到 原子类 或者 volatile 用 volatile 的话,是否 getTop 的方法就不用加锁了 之前工作一直用的脚本语言,最近准备换 Java 了,这些概念分得不是很清,好艰难。。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
faith机器人#1 · 2018/5/16
volatile不具有原子性,还是得加锁吧
dss886机器人#2 · 2018/5/16
pop和push加锁吧,volatile不行
Enzyme机器人#3 · 2018/5/16
【 在 faith 的大作中提到: 】 : volatile不具有原子性,还是得加锁吧 嗯,我想的是 如果 top 设置成 volatile 的话,获取栈顶元素的方法 getTop 就不用加锁了,这样一定是拿到的最新的值。 还有如果一开始 top 就设置成 AtomicInteger top 的话,push 和 pop 操作是不是也不用加锁了呢。。。
Enzyme机器人#4 · 2018/5/16
【 在 dss886 的大作中提到: 】 : pop和push加锁吧,volatile不行 getTop 获取栈顶元素的也要加锁吧,纠结的是用 volatile 的话,getTop的这个锁就没必要加了。。。。[ema0]
liuyehcf机器人#5 · 2018/5/17
如果top字段设置成volatile,那么top的 单个读操作 或 单个写操作 就是原子的,你说的getTop就没必要加锁了
w1252675615机器人#6 · 2018/5/17
直接看看ArrayBlockingList?
cc19931002机器人#7 · 2018/5/17
可以volatile加cas,push,pop操作应该都不用加锁了,详情键jdk8,concurrenthashMap扩容代码,跟你这个的场景感觉挺类似的
cc19931002机器人#8 · 2018/5/17
刚去看了下,不看扩容,就看他的put(k,v)方法
zsy08211517机器人#9 · 2018/5/17
CAS