我发现上面的注释在书JCIP中被广泛使用。 我认为这是非常有用的,因为即使没有适当的文档,它也说明了有关同步策略的一些事情。 我还看到, Intellij Idea使用这些注释他们现在是否是Java语言本身的一部分?
在Unix shell编程中, pipe道操作员是一个非常强大的工具。 通过一小组核心实用程序,一个系统语言(如C)和一个脚本语言(如Python),可以构build极其紧凑且function强大的shell脚本,并由操作系统自动并行化。 显然这是一个非常强大的编程范例,但是我还没有看到pipe道是除shell脚本以外的任何语言的一级抽象。 使用pipe道复制脚本function所需的代码似乎总是相当复杂。 所以我的问题是为什么我没有看到像C#,Java等现代高级语言中类似Unixpipe道的东西? 是否有支持一streampipe道的语言(不是shell脚本)? 这不是expression并发algorithm的一种方便而安全的方法吗? 为了防止有人出现,我查看了F#pipe道转发操作符(前向pipe道操作符),它看起来更像是一个函数应用操作符。 它将一个函数应用于数据,而不是将两个stream连接在一起,据我所知,但我愿意纠正。 后记 :在做协同工作的一些研究时,我意识到有一些相似之处。 在一篇博客文章中,马丁·沃尔夫描述了一个与我的类似的问题,但是在协程而不是pipe道方面。
当我尝试编译这个简单的程序时: #include<thread> void f() { std::this_thread::sleep_for(std::chrono::seconds(3)); } int main() { std::thread t(f); t.join(); } 在Ubuntu 10.04(32位)上使用gcc 4.4.3版本: $ g++ -std=c++0x -pthread a.cpp -oa 我得到: error: 'sleep_for' is not a member of 'std::this_thread' 我看着标题“线程”。 sleep_for()被_GLIBCXX_USE_NANOSLEEP保护 #ifdef _GLIBCXX_USE_NANOSLEEP … /// sleep_for template<typename _Rep, typename _Period> inline void sleep_for(const chrono::duration<_Rep, _Period>& __rtime) … 为什么_GLIBCXX_USE_NANOSLEEP没有定义? 我如何得到这个例子来编译? 更新2012年9月17日 (jogojapan):今天我遇到了同样的问题,使用GCC 4.7.1。 […]
是否可以在运行时以编程方式检查持有给定对象的锁的线程的名称?
从第11章( 性能和可伸缩性 )和JCIP书籍的命名上下文切换部分: 当一个新的线程被切换时,它所需要的数据不太可能在本地处理器caching中,所以上下文切换会导致一连串的caching未命中,因此线程在第一次调度时会运行得更慢一些。 有人可以用一种容易理解的方式解释caching未命中的概念和其可能的相反( caching命中 )吗? 为什么上下文切换会导致很多caching未命中?
我正在阅读并发。 我的脑海中有一些混淆相似的定义。 即: stream程 主题 “绿色线索” Protothreads 纤维 协同程序 Go语言中的“Goroutines” 我的印象是,区别在于:(1)是真正的并行还是多路复用; (2)是否在CPU,操作系统或程序中进行pipe理; 和(3..5)其他一些我无法识别的东西。 对于这些并行性方法之间的差异,有没有一个简洁而明确的指导?
我使用ThreadLocal 在我的Java类中,我有时使用ThreadLocal作为避免不必要的对象创build的手段: @net.jcip.annotations.ThreadSafe public class DateSensitiveThing { private final Date then; public DateSensitiveThing(Date then) { this.then = then; } private static final ThreadLocal<Calendar> threadCal = new ThreadLocal<Calendar>() { @Override protected Calendar initialValue() { return new GregorianCalendar(); } }; public Date doCalc(int n) { Calendar c = threadCal.get(); c.setTime(this.then): // use n to mutate c return […]
在“Java并发实践”一书中,我们多次被告知,我们程序的指令可以由编译器,JVM在运行时甚至处理器进行重新sorting。 所以我们应该假定被执行的程序不会按照我们在源代码中指定的顺序执行它的指令。 然而,讨论Java内存模型的最后一章提供了“ 发生之前”规则的列表,指示JVM保留哪些指令sorting。 第一条规则是: “程序顺序规则。线程中的每个动作都发生在该线程中的每个动作之前,这些动作在程序顺序中稍后进行。 我相信“程序顺序”是指源代码。 我的问题是 :假设这条规则,我想知道什么样的指令可能会被重新sorting。 “行动”定义如下: Java内存模型是根据操作来指定的,包括对variables的读写操作,监视器的locking和解锁,以及与线程的启动和连接。 JMM定义了在程序中的所有操作之前发生的部分sorting。 为了保证执行动作B的线程可以看到动作A的结果(不pipeA和B是否出现在不同的线程中),在A和B之间的关系之前必定有一个事件发生。如果在两个操作,JVM可以自由地对其进行重新sorting。 其他提到的订单规则是: 监视locking规则。 在同一监视器锁上的每个后续锁之前,都会发生监视器锁的解锁。 易变的规则。 写入到易失性字段会在每次后续读取相同字段之前发生。 线程启动规则。 线程上的Thread.start调用在启动线程中的每个操作之前发生。 线程终止规则。 线程中的任何动作发生在任何其他线程检测到线程已终止之前,无论是从Thread.join成功返回还是由Thread.isAlive返回false。 中断规则。 另一个线程上的线程调用中断发生在被中断的线程检测到中断之前(通过抛出InterruptedException或者调用isInterrupted或者中断)。 终结者规则。 对象的构造函数的结束发生在该对象的终结器开始之前。 及物。 如果A发生在B之前,B发生在C之前,那么A发生在C之前。
当使用一个ExecutorService和Future对象(当提交Runnable任务时),如果我为将来的get函数指定一个超时值,当抛出TimeoutException时,底层线程是否被TimeoutException ?
我想了解Go中的并发性。 特别是,我写了这个线程不安全的程序: package main import "fmt" var x = 1 func inc_x() { //test for { x += 1 } } func main() { go inc_x() for { fmt.Println(x) } } 我认识到我应该使用渠道来防止x竞争条件,但这不是重点。 该程序打印1 ,然后似乎永远循环(不打印任何更多)。 我希望它打印出一个无限的数字列表,可能跳过一些,并重复其他人由于竞争条件(或更糟糕的 – 打印数字,而它正在更新inc_x )。 我的问题是:为什么程序只打印一行? 只是要清楚:我没有使用渠道的目的这个玩具的例子。