线程安全类:在线程安全类中封装了必要的同步机制,客户端无须进一步采取同步措施

示例:一个无状态的Servlet

 @ThreadSafe
public class StatelessFactorizer implements Servlet{
public void service(ServletRequest req,ServletResponse resp){
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
encodeIntoResponse(resp,factors);
}
}

这个类是无状态的,因为它既不包含任何域,也不包含任何对其他类中域的引用,计算过程中用到的变量是局部变量没有被共享。

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

在并发编程中,由于不恰当执行时序而出现不正确结果的情况,称为竞态条件。

最常见的竞态类型就是先检查后执行操作:比如单例中的延迟初始化。

像递增,递减操作看上去只有一个操作,但这个操作并非原子的,会导致结果变得不可靠。这种情况称为:读取-修改-写入的复合操作,也是竞态类型的一种。

对于这些竞态条件类型的操作可以加上同步锁,或者使用一个现有的线程安全类。

如:

  @ThreadSafe
public class CountingFactorizer implements Servlet{
private final AtomicLong count = new AtomicLong(0);
public long getCount(){return count.get();}
public void service(ServletRequest req,ServletResponse resp){
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
count.incrementAndGet();
encodeIntoResponse(resp,factors);
}
}

在java.util.concurrent.atomic包中包含了一些原子变量类,用于实现在数值和对象引用上的原子状态转换。

注意:当在不变性条件中涉及多个变量时,各个变量间并不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。因此,当更新某一个变量时,需要在同一个原

子操作中对其他变量同时更新

重入:当某个线程请求一个由其他线程持有的锁时,发出的请求线程会被阻塞。然而内置锁是可以重入的,因此某个线程试图获得一个已经由他自己持有的锁,那么这个请求就会成

功。

这个过程可以描述为:线程请求一个未被持有的锁,JVM记下这个新的锁持有者,计数值置为1,当这个线程再次获取这个锁,计数值将递增。当线程退出同步代码块时,计数器会相

应的递减。当计数值为0时,这个锁将被释放。

示例:

 public class Widget{
public synchronized void doSomething(){
...
}
} public class LoggingWidget extends Widget{
public synchronized void doSomething(){
super.doSomething();
}
}

使用锁保护时,对于包含多个变量的不变性条件,其中涉及的所有变量都需要由同一个锁来保护。

注意:当执行时间较长的计算或者无法快速完成的操作时,一定不要持有锁。

最新文章

  1. Raspberry Pi I2C驱动 (Python)
  2. 开始学java痛苦之旅开启 12-31日 第一章节笔记
  3. linux基础-第九单元 利用vi编辑器创建和编辑正文文件
  4. Java--剑指offer(7)
  5. UVALive 6264 Conservation --拓扑排序
  6. 通过Javascript模拟登陆Windows认证的网站
  7. Java---练习(面试题) :字符串截取(2-最终版)
  8. 替换__thread的一种方式,实现TLS功能
  9. LeetCode OJ 337. House Robber III
  10. 配置网络yum源
  11. js通过class获取元素时的兼容性解决方案
  12. ORM对象关系映射之GreenDAO建立多表关联
  13. django上传图片简单验证以及自动修改图片名称
  14. spring静态注入
  15. VS2010 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  16. 深度学习Tensorflow生产环境部署(上·环境准备篇)
  17. Android面试题目整理与解说(二)
  18. macos 下安装virtualenv,virtualenvwrapper,然后在pycharm中正常配置方法日志
  19. flask实现简单的接收json返回json的接口
  20. HttpApplicationState与HttpApplication

热门文章

  1. Java基础知识强化之IO流笔记34:OutputStreamWriter(Writer字符流的子类)5种write数据方式
  2. Mybatis高级应用
  3. css修改li前面的小圆点的颜色
  4. Windows I/O模型、同步/异步、阻塞/非阻塞
  5. BUG Error:Execution failed for task ':app:dexDebug'.
  6. MVC权限模块
  7. Windows phone 之常用控件
  8. 如何让你的eclipse运行更快和eclipse常用快捷键
  9. css字体大小设置em与rem的区别
  10. ibatis面试笔记