标签: concurrent-programming

如果不发生争用,则在读取时需要同步

考虑下面的代码狙击:

package sync;

public class LockQuestion {
    private String mutable;

    public synchronized void setMutable(String mutable) {
        this.mutable = mutable;
    }

    public String getMutable() {
        return mutable;
    }   
}
Run Code Online (Sandbox Code Playgroud)

在Time1线程Thread1将更新'mutable'变量.在setter中需要同步,以便将内存从本地缓存刷新到主内存.在时间Time2(Time2> Time1,没有线程争用)线程Thread2将读取mutable的值.

问题是 - 我需要在getter之前进行同步吗?看起来这不会导致任何问题 - 内存应该是最新的,Thread2的本地缓存内存应该由Thread1无效和更新,但我不确定.

java concurrency multithreading locking concurrent-programming

9
推荐指数
1
解决办法
6161
查看次数

ConcurrentHashMap返回一个弱一致的迭代器,为什么我们应该使用它呢?

我正在阅读Java Concurrecny这本书.在第85页的第5.2.1节中,它讨论了ConcurrentHashMap及其优点.然而,在一个部分中,书籍声称

ConcurrentHashMap返回的迭代器非常一致.这意味着这个迭代器可以容忍并发修改,遍历构造迭代器时存在的元素,并且可以(但不保证)反映迭代器构造后对集合的修改.

从我理解为什么并发程序中的整个同步点是允许线程以一致的方式访问共享资源,而ConcurrentHashMap并没有真正实现这一点.那么为什么要使用呢?

java concurrency concurrenthashmap concurrent-programming

9
推荐指数
1
解决办法
3463
查看次数

在分布式和并发环境中生成唯一序列号时有哪些权衡?

我很好奇在分布式和并发环境中生成唯一序列号的约束和权衡.

想象一下:我有一个系统,它所做的就是每次提出时都会返回一个唯一的序列号.这是这种系统的理想规范(约束):

  • 保持高负荷.
  • 允许尽可能多的并发连接.
  • 分布式:跨多台机器分散负载.
  • 性能:尽可能快地运行并具有尽可能多的吞吐量.
  • 正确性:生成的数字必须:
    1. 不要重复.
    2. 每个请求都是唯一的(如果任何两个请求在同一时间发生,则必须有一种断开关系的方式).
    3. (增加)顺序.
    4. 请求之间没有差距:1,2,3,4 ......(实际上是一个总#请求的计数器)
  • 容错:如果一台或多台机器或所有机器发生故障,它可以恢复到故障前的状态.

显然,这是一个理想化的规范,并非所有约束都可以完全满足.参见CAP定理.但是,我很想听听您对各种限制因素的分析.我们将留下什么类型的问题以及我们将使用什么算法来解决剩余的问题.例如,如果我们摆脱了计数器约束,那么问题就变得容易了:因为允许间隙,我们可以对数值范围进行分区并将它们映射到不同的机器上.

欢迎任何参考(论文,书籍,代码).我还想保留一份现有软件清单(开源与否).


软件:

  • Snowflake:一种网络服务,可以通过一些简单的保证在大规模生成唯一的ID号.
  • keyspace:一个可公开访问的唯一128位ID生成器,其ID可用于任何目的
  • RFC-4122实现存在于许多语言中.RFC规范可能是一个非常好的基础,因为它可以防止任何系统间协调,UUID是128位,并且当使用来自实现某些版本规范的软件的ID时,它们包含一个时间代码部分,可能的分类等

counter guid distributed-computing sequence concurrent-programming

8
推荐指数
1
解决办法
781
查看次数

开始使用stact框架

我一直在查看Topshelf代码,并注意到它正在使用名为'stact.dll'的程序集.关于此,似乎没有很多信息.它似乎是一个使用actor和'channels'构建并发应用程序的库.我发现Topshelf代码有点难以理解,但我有兴趣了解更多有关这种编程风格的信息.有没有人有这个图书馆的经验?你是怎么学习如何使用它的?

concurrent-programming topshelf

8
推荐指数
1
解决办法
1434
查看次数

何时选择多线程或多处理?

我从未在并发编程上做过什么.我对它们的了解仅来自OS书籍.

我今天在接受采访时遇到了这个问题.我想知道是否有人可以给我一个直观的

多线程和多进程的解释以及何时选择它们.或者,也许你可以

推荐我一些书籍或实际例子的链接.我想阅读的源代码

开源项目(c/c ++)与conccurent编程,希望你能推荐一个.

非常感谢您的帮助.

multithreading concurrent-programming

8
推荐指数
1
解决办法
3850
查看次数

哪些条件的实现不需要当前线程来保持锁定?

最近,我从" 多处理器编程的艺术 "第8章中读到了一些关于" 监视器和阻塞同步 "的例子,这些例子使用了signalAll()一个Condition对象,而没有获得与之相关的锁Condition.

令人惊讶的是,我没有在本书的勘误表中找到任何修复这些例子的方法.此外,他们建议对a的图8.12的例子进行修正FifoReadWriteLock,但他们继续使用signalAll()没有锁定的情况.这扰乱了我,我试图找到关于这些示例的其他注意事项,以了解这些Java示例以这种方式编写的原因.

例如,问题的答案 " 读写互斥锁如何工作?"显示了a的实现的相同示例FifoReadWriteLock,它实现了writeUnlock():

void writeUnlock() {
    writer = false;
    condition.signalAll();
}
Run Code Online (Sandbox Code Playgroud)

关于没有锁定获取,您可以阅读两个不同的原因:

  1. 仅将其用作伪代码
  2. 条件变量的某些实现不要求锁定信号.

由于本书使用了Java中的示例并明确说明了以下内容,因此很难接受第一个参数:

本书使用Java编程语言.

关于第二点,我知道方法的java.util.concurrent.locks.Condition状态中的Java API signal():

当调用此方法时,实现可能(并且通常确实)要求当前线程保持与此关联的锁Condition.

如果仅" 实施可能 ",则意味着它不是强制性的.然而,据我所知,我发现任何不符合此要求的实施方案.所以我想知道哪些Java Condition实现不需要当前线程来保存锁?

parallel-processing multithreading locking java.util.concurrent concurrent-programming

8
推荐指数
1
解决办法
149
查看次数

提升asio异步等待条件变量

是否可以对boost :: asio中的条件变量执行异步等待(读取:非阻塞)?如果没有直接支持,任何有关实施它的提示将不胜感激.

我可以实现一个计时器,甚至每隔几毫秒启动一次唤醒,但这种方法非常低劣,我发现很难相信条件变量同步没有实现/记录.

c++ pthreads boost-thread boost-asio concurrent-programming

7
推荐指数
1
解决办法
4687
查看次数

与许多goroutines一起消耗内存

我试图检查Go将如何使用100,000 goroutines.我写了一个简单的程序来产生许多例程,除了打印一些公告之外什么都不做.我将MaxStack大小限制为仅512字节.但我注意到程序大小并没有减少.它消耗了大约460 MB的内存,因此每个goroutine大约4 KB.我的问题是,我们可以设置最大堆栈大小低于goroutines的"最小"堆栈大小(可能是4 KB).我们如何设置Goroutine开始的最小堆栈大小?以下是我用于测试的示例代码:

package main

import "fmt"
import "time"

import "runtime/debug"

func main() {
    fmt.Printf("%v\n", debug.SetMaxStack(512))
    var i int
    for i = 0; i < 100000; i++ {
        go func(x int) {
            for {
                time.Sleep(10 * time.Millisecond)
                //fmt.Printf("I am %v\n", x)
            }
        }(i)
    }
    fmt.Println("Done")
    time.Sleep(999999999999)
}
Run Code Online (Sandbox Code Playgroud)

go concurrent-programming

7
推荐指数
3
解决办法
4021
查看次数

React PHP如何处理异步非阻塞I/O?

React PHP如何处理异步非阻塞I/O?

Nodejs使用其事件队列来处理不同线程上的I/O. 它使用libuv.就像在PHP中一样,React如何处理单个线程上的非阻塞I/O进程?

php asynchronous concurrent-programming reactphp

7
推荐指数
1
解决办法
3543
查看次数

这些是线程安全的吗?

我今天参加了面试,面试官问我以下问题:

重新入侵和互斥是线程安全的吗?你能解释一下原因吗?

我对并发编程比较陌生,无法回答它..但我说......

相互排斥是线程安全的.但重新入门不是,这就是为什么我们有可重入锁定的原因.

面试官转到下一个问题但是到了另一个地方......我想我搞砸了这个......

当他问我这个时,他期待我说什么?

thread-safety concurrent-programming

6
推荐指数
1
解决办法
563
查看次数