V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  chengyiqun  ›  全部回复第 1 页 / 共 31 页
回复总数  608
1  2  3  4  5  6  7  8  9  10 ... 31  
7 天前
回复了 livc 创建的主题 Linux wine 10.0 发布了
@jjustwin 针对绝大多数时候都用 linux, 偶尔需要用下 windows 程序的人, 但又不想重启系统切换.
7 天前
回复了 Niner 创建的主题 Java update 大家会允许这样写吗?
我知道 python 的 flask 在
u.setName(myname);
u.setAge(myAge);
之后就可以直接 commit 了,
java 好像真没啥好办法, 想要性能好还要加锁就只能乐观锁了.
9 天前
回复了 Peace2021 创建的主题 推广 我用了半个小时开发了一个小游戏
连接服务器失败(
我直接写的回家过年
把播放绑定在一个 click 事件里, 页面的元素绑定这个事件, 代码里触发一下这个元素的点击事件?
"让前面排队的先结账"
2D 的人脸识别就是闹呢, 还没有随机颜色, 安全性很低, 建议不用
20 天前
回复了 ShioWSX 创建的主题 职场话题 各位程序员的护眼技巧分享一下
室内开灯的时候, 我总是喜欢明亮主题
21 天前
回复了 fengmengqiu 创建的主题 Windows win11 台机机卡顿,到底是哪里的问题
看看事件查看器里, 系统日志有没有内核事件
22 天前
回复了 vvve 创建的主题 程序员 pycharm 自动 import 好抽象
import on fly 我早关了, 那玩意儿总会导入意料之外的效果
@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 就是这玩意儿没有多标签, 就不是很方便了
35 天前
回复了 LogicDX342 创建的主题 程序员 关于安卓文件名中特殊字符的处理方式
@wnpllrzodiac 但我没见过哪个系统不支持方括号文件名的?
1  2  3  4  5  6  7  8  9  10 ... 31  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1939 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 35ms · UTC 15:05 · PVG 23:05 · LAX 07:05 · JFK 10:05
Developed with CodeLauncher
♥ Do have faith in what you're doing.