V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  chengyiqun  ›  全部回复第 1 页 / 共 30 页
回复总数  594
1  2  3  4  5  6  7  8  9  10 ... 30  
@ccpp132 说的不够准确,jvm 不是看 cpu 占用高去 JIT 优化的,而是看代码执行次数。
while (su.getA() <= 100) 这个自旋操作内部没有 sleep ,的执行次数是非常多的,会轻易达到 JIT 优化阈值。
@kandaakihito #7 线程 1 执行的时候,永远读取到旧值,while (su.getA() <= 100) 这个自旋操作,其实是一个很耗费 CPU 的操作,你要是在循环里加一个 Thread.sleep(1),就不会卡死了
a++ 是一个复合操作,读取 a 的值、增加值、写回值,这个操作本身不是原子性的(这个你反编译字节码可以看到)
为了保证多线程环境下的准确性, 请务必使用原子变量自增,或者在 incr 方法加上 synchronized 关键字
你这逻辑有问题, a 这个变量是非原子的, 线程 2 修改了 a 变量后, 对线程 1 来说, 不可见, 所以会陷入死循环, 这涉及到多核处理器的缓存同步问题(如果你是在单核处理器上运行, 就没有问题了)
线程读取变量的时候, 从缓存中读取, 而不同的核心之间除了 L3 缓存是共享的, 其他缓存都是不共享的.
你可以加一个内存屏障 private volatile int a = 0;
volatile 让每次读取变量 a 的值的时候总是从内存中读取
不过, 这还不是原子的, 最好使用 AtomitInt 来定义 a 变量

```
public class Solution {

private final AtomicInteger a = new AtomicInteger(0);

public void incr() {
a.incrementAndGet();
}

public int getA() {
return a.get();
}

public static void main(String[] args) throws InterruptedException {
Solution su = new Solution ();

Thread t1 = new Thread(() -> {
while (su.getA() <= 100) {
System.out.println(Thread.currentThread().getName() + " : " + su.getA());
if (su.getA() % 3 == 0) {
System.out.println(su.getA());
su.incr();
}
}
});

Thread t2 = new Thread(() -> {
while (su.getA() <= 100) {
if (su.getA() % 3 == 1) {
System.out.println(su.getA());
su.incr();
}
}
});

Thread t3 = new Thread(() -> {
while (su.getA() <= 100) {
if (su.getA() % 3 == 2) {
System.out.println(su.getA());
su.incr();
}
}
});

t2.start();
t3.start();

System.out.println("current: " + su.getA());
// Thread.sleep(10);
Thread.sleep(100);
// System.out.println(Thread.currentThread().getName() + " : " + su.getA());

t1.start();

}

}
```

这是修改后的代码
@w568w 就是这玩意儿没有多标签, 就不是很方便了
11 天前
回复了 LogicDX342 创建的主题 程序员 关于安卓文件名中特殊字符的处理方式
@wnpllrzodiac 但我没见过哪个系统不支持方括号文件名的?
25 天前
回复了 ChaosAttractor 创建的主题 NAS 执行低级格式化后数据居然没丢?
执行 fastFormat 就不可能是低格了
25 天前
回复了 XhivaW 创建的主题 Android 咨询哪里有 ChatGPT 的 apk 下载
这个可不是什么魔改, BUNDLE=base.apk+split_XXX.apk
这是谷歌官方的格式, 而且是 Android studio 默认的格式
我是 23H2 ,没遇到这个问题
https://i.imgur.com/73sq5kJ.png
47 天前
回复了 yangzzzzzz 创建的主题 Windows win11 24h2 开机后第一次打开程序特别慢
24h2 的问题网友不少有说还是问题不少的,我现在两台电脑都是用的 23h2 ,还是比较稳定的。
之前升级 24h2 时,所有 electron 的程序窗口都变成了空白,就离谱,最后还是回退了,我数个月内是不会升级 24h2 了
鼠标贵可以换热插拔微动板,便宜就直接换鼠标
2023-12-14 14:54:12 +08:00
回复了 michael2016 创建的主题 新手求助 有没有好的祛除图片上的马赛克方案?
如果马赛克能去除,那信息论就被打破了。应该颁发诺贝尔奖。
2023-08-31 11:05:44 +08:00
回复了 Mmahaha 创建的主题 Google 关于 google.com 自动重定向至 google.cn/m
参考: https://vps.dance/google-ip-location.html
2023-08-08 14:09:57 +08:00
回复了 linyimin520812 创建的主题 程序员 分享一种 Spring 应用启动过程采样的方法
感觉不错, mark 了
2023-08-08 14:03:23 +08:00
回复了 looveh 创建的主题 程序员 V 友们怎么管理自己的密码?
keepass, 使用多个网盘同步数据库文件
哦, 顺便提一下, 如果需要 windows 版本的 ffmpeg
可以从这里下
https://www.gyan.dev/ffmpeg/builds/#release-builds
是支持 gpu 加速的
2023-07-21 11:18:06 +08:00
回复了 ChenSino 创建的主题 程序员 如何使用+86 手机登录电报?
@ChenSino 仅仅是因为部分地区的运营商屏蔽了部分区段的境外短信而已
2023-07-21 11:15:35 +08:00
回复了 Jackk123 创建的主题 程序员 如何使用私人电脑访问公司内网
使用公司提供的 vpn 程序, 这是最保险的(
1  2  3  4  5  6  7  8  9  10 ... 30  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1358 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 38ms · UTC 23:54 · PVG 07:54 · LAX 15:54 · JFK 18:54
Developed with CodeLauncher
♥ Do have faith in what you're doing.