处理相同的函数运行,同时处理相同的数据

我有一个 php 系统,允许客户使用电子钱包 (商店信用) 从我们的系统购买东西 (下订单)。 下面是数据库示例 * * Sales_order * * -------- ------- ---------- -------- -------------- ----------- | Order _ id | 价格 | product__ id | 状态 | 已经 _ 退款 | 客户 _ id | -------- ------- ---------- -------- -------------- ----------- | 1 | 1000 | 1 | 取消 | 1 | 2 | | 2 | 2000 | 2 | 待定 | 0 | 2 | | 3000 | 3 | 完成 | 0 | 1 | -------- ------- ---------- -------- -------------- ----------- * * 电子钱包 * * ----------- ------- | Customer_id | 平衡 | ----------- ------- | 1 | 43200 | | 2 | ……

共11个回答, 标签: php mysql concurrency race-condition
对象是否始终看到其最新的内部状态, 而不考虑线程?

假设我有一个可运行的简单整数计数变量, 每次可运行运行时都会递增。提交此对象的一个实例, 以便在计划的执行器服务中定期运行。 class Counter implements Runnable { private int count = 0; @Override public void run() { count++; } } Counter counter = new Counter(); ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); executorService.scheduleWithFixedDelay(counter, 1, 1, TimeUnit.SECONDS); 在这里, 对象访问其自身的内部状态在不同线程内 (读取和递增)。此代码是线程安全的, 还是当 count 变量计划在不同的线程中时, 我们可能会丢失对该变量的更新? ……

共3个回答,已解决, 标签: java multithreading concurrency
如果我们有足够的处理器来服务所有线程,Thread.yield () 会做什么吗?

如果我们在一台有两个处理器的机器上有两个正在运行的线程,我们会调用螺纹的产量 ()在其中一个线程中,没有任何事情会发生 (调度程序基本上会忽略请求),因为我们有足够的处理器来为正在运行的线程提供服务,这是否合理? ……

共3个回答,已解决, 标签: java multithreading concurrency java-threads thread-synchronization
将指向原子类型的指针分配给非原子类型的指针

此代码的行为是否定义良好? #include const int test = 42; const int * _Atomic atomic_int_ptr; atomic_init(&atomic_int_ptr, &test); const int ** int_ptr_ptr = &atomic_int_ptr; printf("int = %d\n", **int_ptr_ptr); //prints int = 42 -------------------------------------------------------------------------------- 我将指向原子类型的指针分配给非原子类型的指针 (这些类型是相同的)。以下是我对此示例的想法: 《标准》明确指定 const volatile restrict 了限定符的区别和限定符 _Atomic 6.2.5(p27) : > 只要允许类型的原子版本以及类型的其他限定版本, 本标准就显式使用短语 "原子、限定或不合格类型"。"限定或不合格类型" 一词, 没有具体提及原子, 不包括原子类型。 此外, 限定类 ……

共2个回答,已解决, 标签: c concurrency language-lawyer c11 stdatomic
在 hashmap 中,将新元素添加到桶的内部链表中总是在末尾。为什么?

在 hashmap 中,当我们有相同的 hashcode 时,我们将对象作为链接列表插入,链接列表稍后会转换为 TreeNode。每个具有相同 hashcode 的新对象都被添加到附加的链表的最后一个。所以,我在这里的问题是,为什么我们不将新元素作为附加到桶中的内部链表的第一个元素添加?我们为什么要遍历到最后一个元素,然后添加新元素。 > 链接列表花费的时间: 开始时插入新元素 = O (1) 在末尾插入新元素 = O (n) -------------------------------------------------------------------------------- 一个可能的答案可能是,因为 hashmap 不是线程安全的,从单个位置同时读写元素会导致异常。例如,有两个事务: T1 -- 将新对象添加到 hashmap 中已经存在 hashcode 的地图中。 T2 -- 从地图中读取新对象,hashmap 中已经有 hashcode。 当这两个事务同时发生,我们开始将新元素添加到开始位置而不是最后位置时,阅读操作可能会受到影响, 由于在第一个位置正在进行更改。 如 ……

共1个回答,已解决, 标签: java collections concurrency linked-list hashmap