原文链接 译者:秦建平 校对:方腾飞

首先来看一个问题:

下面这个方法是线程安全的吗?如何才能让这个方法变成线程安全的?

public class MyCount {

private static int counter = 0;

public static int getCount(){

return counter++;

}

}

首先,这个方法不是线程安全的,因为counter++操作不是一个原子性的操作,也就意味着counter++操作包含了好几个原子性的操作。实际上,counter++包含了三个原子性的操作,第一步是获取counter的值,第二步是对counter的值加1,第三步是写入的操作。在多线程环境对getCount()方法的调用,可能会出现下面的场景:

方法1:

对这个方法增加同步的控制,会让这个方法变成线程安全的。当给静态方法添加synchronized关键字修饰的时候,实际上锁定的是这个类所对应的Class对象。在JVM中,一个类只会存在一个Class对象。

代码示例如下:

public class MyCount {

private static int counter = 0;

public static synchronized int getCount(){

return counter++;

}

}

如果这个方法不是静态的,那么给方法添加synchronized关键字修饰的时候,锁住的实际上是相应的实例对象,而不是这个类所对应的Class对象。

方法2:

在这个特殊的计数器的例子当中,实际上只要把counter++操作变成原子操作,就可以让这个方法变成是线程安全的方法。在jdk5的线程库,java.util.concurrent.atomic包中提供的AtomicInteger类可以满足我们的需求。

代码示例如下:

public class MyCount {

private static AtomicInteger counter = new AtomicInteger(0);

public static int getCount(){

return counter.getAndIncrement();

}

}

java 线程安全_Java创建线程安全的方法相关推荐

  1. java singleton 多线程_Java创建线程安全的单例singleton

    Java创建线程安全的单例 单例的使用场景 JVM中仅需要一个实例,因此能节省内存,加快访问速度,比如数据库连接池,计数器等.Spring 中的Bean,默认也是单例的,共享资源的访问,比如日志文件, ...

  2. java 创建线程的三种方法_java 创建线程的几种方式

    说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { p ...

  3. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

  4. 如何使用Java 5 Executor框架创建线程池

    Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概 ...

  5. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  6. Java用Callable接口创建线程

     一.概述  使用Callable接口创建线程能够返回数据.与Runnable接口创建线程的方式有点类似,也是需要通过Thread类来创建线程.由于Thread类的构造函数中没有Callable接口, ...

  7. Java 并发 多线程:创建线程的四种方式

    Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...

  8. java创建线程代码_Java创建与结束线程代码示例

    本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程同步.调度.线程池等内容将会在后续章节中逐步深入. 创建线程 创建普通线程有两种方式,继承Thread类 ...

  9. java线程创建过程_Java创建线程的细节分析

    转载:http://shmilyaw-hotmail-com.iteye.com/blog/1880902 前言 关于线程创建的问题,可以说是老生常谈了.在刚开始学习Thread的时候基本上都会接触到 ...

最新文章

  1. HTTP协议Etag详解
  2. 轻松抓鸡蛋、剪纸、夹芯片,这只“机械爪”堪比人手!
  3. ImageMagick常用指令详解
  4. 【Python】青少年蓝桥杯_每日一题_1.19_Python 求和
  5. 两周的时间教会我,要低头做人(jQuery实现京东购物车)
  6. 中国-中东欧国家特色农产品 云上国际农民丰收节贸易会
  7. 信息系统项目管理师-案例分析专题(二)案例中常见问题找茬笔记
  8. python宣传图片_宣传图片制作网站
  9. python数据可视化代码_python数据可视化
  10. 子函数的指针释放问题
  11. 工作292:数据绑定逻辑处理
  12. 《Effective Debugging:软件和系统调试的66个有效方法》一第5条:在能够正常运作的系统与发生故障的系统之间寻找差别...
  13. STM32 DAC详解
  14. 薄板样条插值(Thin plate splines)的实现与使用
  15. 音视频之hls rtmp rtsp 视频流测试地址
  16. 请求参数完整性校验,解决流只能写一次的问题
  17. 从此刻起  文/毛毛虫
  18. FLASH PLAYER 谷歌浏览器浏览网站无法正常显示的问题
  19. 【渝粤教育】电大中专中医基础知识 作业 题库
  20. Toefl-Speaking

热门文章

  1. 河南省第十三届ICPC大学生程序设计竞赛 【部分题题解】
  2. 4.1.5 文件存储空间管理
  3. 多线程,你觉得你安全了?(线程安全问题)
  4. ActiveMQ添加商品发送消息
  5. linux文件的定义变量的值,linux $变量含义($0,$1,$2,$#,$@) ----linux 基础
  6. 【计算机网络(微课版)】第5章 传输层 课后习题及答案
  7. 蓝桥杯-回文数(java)
  8. python创建文件夹 覆盖_Python 创建新文件时避免覆盖已有的同名文件的解决方法...
  9. SpringBoot-切面AOP实现统一逻辑处理
  10. hashcode值一样对象一定相同吗_HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...