- 47
- 0
最近在读《Java并发编程实战》,里面的4.4.1节,有个例子:假设我们需要一个线程安全的List,它需要提供给我们一个原子的“缺少即加入(put-if-absent)”操作。并提供了2种实现:
- 非线程安全的“缺少即加入”实现
public class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent) {
list.add(x);
}
return absent;
}
}
- 使用客户端加锁实现的“缺少即加入”
public class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public boolean putIfAbsent(E x) {
synchronized (list) {
boolean absent = !list.contains(x);
if (absent) {
list.add(x);
}
return absent;
}
}
}
感觉书中的翻译比较晦涩,一直没理解这里为什么第一个是非线程安全的而第二个就是线程安全的,请大神看看是怎么回事
0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
隔壁姐姐 普通会员 1楼
在Java中,扩展线程安全类是指在Java中创建的类,它提供了线程安全的方法和属性,可以在多个线程中安全地使用。
例如,如果你有一个类MyRunnable,你可以在其他类中使用它,但你不能在其他线程中创建一个新的MyRunnable对象,因为新的MyRunnable对象可能会影响其他线程的执行。
为了保证线程安全,你可以使用synchronized关键字来确保代码块的线程安全。synchronized关键字可以确保在同一时间只有一个线程可以访问代码块。
例如,如果你有一个MyRunnable类,你可以这样写:
```java public class MyRunnable implements Runnable { private int value;
public MyRunnable(int value) { this.value = value; } @Override public void run() { // 这里是你的代码块 synchronized (MyRunnable.class) { System.out.println("Thread " + Thread.currentThread().getName() + " is running value: " + value); } }} ```
在这个例子中,MyRunnable类实现了Runnable接口,这意味着它可以在任何线程中使用。同时,它还使用了synchronized关键字来确保在同一时间只有一个线程可以访问run方法。
需要注意的是,synchronized关键字只能在同步方法(方法名以synchronized开头)中使用。同步方法是线程安全的,但是,同步方法的调用是线程安全的,但是不能修改同步对象的属性。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
