[关闭]
@ttingtu 2016-03-10T06:12:41.000000Z 字数 1104 阅读 1286

java并发编程实践笔记

Java,并发


如果多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个错误:
- 不在线程间共享该状态变量
- 将状态变量修改为不可变的变量
- 在访问状态变量时使用同步

线程安全性的定义:
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调试代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的

无状态对象一定是线程安全的。

同步 synchronized

静态synchronized方式以class对象作为锁。

重入

如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。"重入"意味着获取锁的操作的粒度是“线程”,而不是“调用”.

当执行时间较长的计算或者可能无法快速完成的操作时(例如网络I/O或者控制台I/O),一定不要持有锁。

加锁的含义不仅仅局限于互斥行为,还包括内存可见性,为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。

violatile变量

violatile是一种比synchronized关键字更轻量级的同步机制。
加锁机制即可以确保可见性又可以确保原子性,而violatile变量只能确保可见性。

仅当vilatile变量能简化代码的实现以及对同步策略的验证时,才应用使用它们。如果在验证正确性时需要对可见性进行复杂的判断,那么就不要使用violatile变量。violatile变量的正确使用方式包括: 确保它们自身状态的可见性,确保它们所引用对象的状态的可见性,以及标识一些重要的程序生命周期事件的发生(例如:初始化或关闭)
以下是violatile变量的一种典型用法:检查某个状态标记以判断是否循环:

  1. violatile boolean asleep;
  2. ...
  3. while(!asleep)
  4. countSomeSheep();

关于调试:对于服务器应用程序,无论在开发阶段还是在测试阶段,启动JVM时一定都要指定-server命令行选项。server模式的JVM将比client模式进行更多的优化。默认情况下为client模式。

发布与逸出

发布:使对象能够在当前作用域之外的代码中使用。
逸出: 当某个不应该发布的对象被发布时,称为逸出。

不要在构造过程中使this引用逸出。
在构造函数中创建线程时,最好不要立即启动它,而是通过一个start或者initialize方法来启动。因为当对象在其构造函数中创建一个线程时,无论是显式创建还是隐式创建,this引用都会被 新创建的线程共享。在对象尚未完全构造之前,新的线程就可以看见它。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注