java 线程安全_Java创建线程安全的方法
原文链接 译者:秦建平 校对:方腾飞
首先来看一个问题:
下面这个方法是线程安全的吗?如何才能让这个方法变成线程安全的?
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创建线程安全的方法相关推荐
- java singleton 多线程_Java创建线程安全的单例singleton
Java创建线程安全的单例 单例的使用场景 JVM中仅需要一个实例,因此能节省内存,加快访问速度,比如数据库连接池,计数器等.Spring 中的Bean,默认也是单例的,共享资源的访问,比如日志文件, ...
- java 创建线程的三种方法_java 创建线程的几种方式
说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { p ...
- executor线程池框架_如何使用Java 5 Executor框架创建线程池
executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...
- 如何使用Java 5 Executor框架创建线程池
Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概 ...
- Java学习笔记:创建线程的两种方法
Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程
- Java用Callable接口创建线程
一.概述 使用Callable接口创建线程能够返回数据.与Runnable接口创建线程的方式有点类似,也是需要通过Thread类来创建线程.由于Thread类的构造函数中没有Callable接口, ...
- Java 并发 多线程:创建线程的四种方式
Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...
- java创建线程代码_Java创建与结束线程代码示例
本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程同步.调度.线程池等内容将会在后续章节中逐步深入. 创建线程 创建普通线程有两种方式,继承Thread类 ...
- java线程创建过程_Java创建线程的细节分析
转载:http://shmilyaw-hotmail-com.iteye.com/blog/1880902 前言 关于线程创建的问题,可以说是老生常谈了.在刚开始学习Thread的时候基本上都会接触到 ...
最新文章
- HTTP协议Etag详解
- 轻松抓鸡蛋、剪纸、夹芯片,这只“机械爪”堪比人手!
- ImageMagick常用指令详解
- 【Python】青少年蓝桥杯_每日一题_1.19_Python 求和
- 两周的时间教会我,要低头做人(jQuery实现京东购物车)
- 中国-中东欧国家特色农产品 云上国际农民丰收节贸易会
- 信息系统项目管理师-案例分析专题(二)案例中常见问题找茬笔记
- python宣传图片_宣传图片制作网站
- python数据可视化代码_python数据可视化
- 子函数的指针释放问题
- 工作292:数据绑定逻辑处理
- 《Effective Debugging:软件和系统调试的66个有效方法》一第5条:在能够正常运作的系统与发生故障的系统之间寻找差别...
- STM32 DAC详解
- 薄板样条插值(Thin plate splines)的实现与使用
- 音视频之hls rtmp rtsp 视频流测试地址
- 请求参数完整性校验,解决流只能写一次的问题
- 从此刻起 文/毛毛虫
- FLASH PLAYER 谷歌浏览器浏览网站无法正常显示的问题
- 【渝粤教育】电大中专中医基础知识 作业 题库
- Toefl-Speaking
热门文章
- 河南省第十三届ICPC大学生程序设计竞赛 【部分题题解】
- 4.1.5 文件存储空间管理
- 多线程,你觉得你安全了?(线程安全问题)
- ActiveMQ添加商品发送消息
- linux文件的定义变量的值,linux $变量含义($0,$1,$2,$#,$@) ----linux 基础
- 【计算机网络(微课版)】第5章 传输层 课后习题及答案
- 蓝桥杯-回文数(java)
- python创建文件夹 覆盖_Python 创建新文件时避免覆盖已有的同名文件的解决方法...
- SpringBoot-切面AOP实现统一逻辑处理
- hashcode值一样对象一定相同吗_HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...