[mess] [java] Concurrent Synopsis

1

如果多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题。

  • 不在线程之间共享该状态变量
  • 修改该状态变量为不可变的变量
  • 在访问该状态变量时使用同步

2

在某些情况中,良好的面向对象设计技术与实际情况的需求并不一致。在这些情况中,可能需要牺牲一些良好的设计原则以换取性能或者对历史代码的向后兼容。有时候,面向对象中的抽象和封装会降低程序的性能,但是在编写并发应用程序是,一种正确的编程方法是,首先使代码正确运行,然后再提高代码的速度。即便如此,最好也只是当性能测试的结果和应用需求告诉你必须提高性能,以及测量结果表明这种优化在实际环境中确实能带来性能提升时,才进行优化。

在编写并发代码时,应该始终遵循这个原则,由于并发错误是非常难以重现和调试的,因此如果只是在某段很少执行的代码路径上获得了性能提升,那么这种益处很可能被程序运行时存在的失败风险抵消。

3

竞态条件(Race Condition)不同于数据竞争(Data Race)。数据竞争指的是在访问共享的非 final 类型的域时没有采取同步来进行协同。当一个线程写入一个变量而另一个线程接下来读取这个变量,或者读取一个之前由另一个线程写入的变量时,如果在这两个县城之间没有使用同步,那么就可能出现数据竞争。在 Java 内存模型中,如果代码中存在数据竞争,那么这段代码就没有确定的语义。并非所有的竞态条件都是数据竞争,同样的,并非所有的数据竞争都是竞态条件,但两者都有可能使并发程序失败。

4

当某个线程请求一个由其他线程持有的锁时,发出请求的线程会阻塞。然而,由于内置的锁是可重入的,因此如果某个线程试图获得一个已经由它自己拥有的锁,那么这个请求会成功。重入意味着获取锁的操作粒度是线程而不是调用。

猜你喜欢

转载自www.cnblogs.com/wander4096/p/9649389.html
今日推荐