V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  hjchjc1993  ›  全部回复第 3 页 / 共 3 页
回复总数  57
1  2  3  
2019-03-06 17:56:09 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
@brainfxxk 谢谢 正解
2019-03-06 17:11:41 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
这样写就没问题了。原来的问题可能确实出现在没有锁 final 对象,自增改变了对象,所以没锁住。
下面这么样写就死锁了。。。

public class DeadLockProblem {

private final Counter counter1 = new Counter();
private final Counter counter2 = new Counter();

private void createDeadLock() {
Runnable first = () -> {
for (int i = 0; i < 100000; i++) {
synchronized(counter1) {
System.out.println("锁住 counter1");
counter1.addOne();
synchronized(counter2) {
counter2.addOne();
}
System.out.println("对 counter1、counter2 的处理完成:" + counter1.getCount() + " " + counter2.getCount());
}
}
};

Runnable second = () -> {
for (int i = 0; i < 100000; i++) {
synchronized(counter2) {
System.out.println("锁住 counter2");
counter2.addOne();
synchronized(counter1) {
counter1.addOne();
}
System.out.println("对 counter1、counter2 的处理完成:" + counter1.getCount() + " " + counter2.getCount());
}
}
};

Thread firstThread = new Thread(first);
Thread secondThread = new Thread(second);
firstThread.start();
secondThread.start();
}

public static void main(String[] args) {
DeadLockProblem deadLock = new DeadLockProblem();
deadLock.createDeadLock();
}
}

class Counter {
private int count = 0;

void addOne() {
count++;
}

int getCount() {
return count;
}
}
2019-03-06 16:47:03 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
@Malthael 其实用其它的写法是很容易做到线程安全的,我只是对这种写法上锁失败的原因表示好奇。。
2019-03-06 16:13:50 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
@ihavecat 改为了
private Integer a = new Integer(200);
private Integer b = new Integer(200);
最后的结果显示仍然不是线程安全的
2019-03-06 15:58:27 +08:00
回复了 onice 创建的主题 Java 请教现在 Java 的技术栈是什么?想提高一下。
我是 spring 程序员
2019-03-06 15:54:54 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
@gaius 确实应该是没锁住,对 JVM 的内存模型还是不太清楚啊。
2019-03-06 15:49:03 +08:00
回复了 noble4cc 创建的主题 Java 现在用 mybatis 都不用 xml 了吗
spring data jpa
2019-03-06 15:32:02 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
@geelaw synchronized 貌似只能锁对象,那这种情况该怎么修改代码才能线程安全呢?
2019-03-06 14:53:44 +08:00
回复了 Phuasheng 创建的主题 程序员 [半自由职业两个月总结] MiniTagcloud 背后的故事
真的很棒,已经收藏了。可是不收费,您是怎么赢利的呢?
2019-03-06 14:29:33 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
再顶下~
2019-03-06 14:27:24 +08:00
回复了 hjchjc1993 创建的主题 问与答 求教,为什么这么做是线程不安全的?
本来想搞一个死锁出来,运行了多次,结果是死锁没有出现,反而 a 和 b 的值表示这么做是线程不安全的,求教啊,别沉
2019-03-06 14:25:07 +08:00
回复了 lzjun 创建的主题 分享创造 发布一个作品
使用的技术能介绍一下吗
2019-03-04 16:35:31 +08:00
回复了 insraq 创建的主题 程序员 Bug 的正式中文翻译是什么?
故障+1
好有趣,笑了
2019-02-28 17:04:11 +08:00
回复了 NieKing 创建的主题 程序员 Android 转 Java 学习路径是怎样的?
@xiaowangge 15 年的大兄弟
2019-02-26 18:04:36 +08:00
回复了 Allianzcortex 创建的主题 程序员 今天写了人生中第一个 makefile ...
以我两周的 c++开发经验,Makefile 可能在命令行的基础上提供了模块之间的依赖关系的信息?
觉得你不太适合自己出来做事。做什么都没想清楚,怎么做就更别提了。在网上发帖别人也没法帮助你的。
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2741 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 08:22 · PVG 16:22 · LAX 00:22 · JFK 03:22
Developed with CodeLauncher
♥ Do have faith in what you're doing.