java线程创建方式_Java创建线程安全的方法

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

首先来看一个问题:

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

public class MyCount {

private static int counter = 0;

public static int getCount(){

return counter++;

}

}

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

e93aa8859e55991a7b576aad8b80402e.png

方法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();

}

}

d0c1501a6d8bb921cf36400dc89de69f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了

在windows家族中,最好用的就是win7和XP系统。堪称经典,而且还是发展最成功的系统版本。前几天韩博士也发布一篇关于XP系统的文章,评论区引发极大争论。大家众说纷纭,觉得XP系统是顺畅,但是很多软件硬件都不支持&#x…

【Swift学习】Swift编程之旅(一)

学习一门新语言最经典的例子就是输出“Hello World!” print("Hello World!")  swift就是这样来输出的。 如果你使用过其他语言,那么看上去是非常的熟悉吧。但比一些c要简单的多吧 1、不需要导入一些单独的库,比如输入/输出或字符…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频,以下为图文演示 软件采集单本数据 …

java总结体会_Java课程总结心得体会

不知不觉中以学习Java将近4个月了,在这几个月的学习中我从一开始的迷茫懵逼,到现在的懵逼迷茫中,写下了这篇这个学期课程的Java学习心得体会。首先,我认为作为一个该开始学习Java的小白,在开始学习之前无论你有多大的热…

为什么用redis做缓存而不是mybatis自带的缓存_如何用Java设计一个本地缓存,涨姿势了...

最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能。当然如果拿来和专门的缓存框架如ehcache来对比可能…

process 类 java_编写可执行jar——java的Process类的使用(二)

你知道怎么在控制台使用ping吗?那你知道怎么在java中使用ping吗?1.批处理文件批处理文件大家一定不陌生。接触最多的应该就是tomcat中的start.bat或者start.sh了。bat是在windows环境下运行的批处理文件,sh则是linux的shell脚本。2.adb指令安…

python从爬虫到数据分析项目_零基础学习Python web开发、Python爬虫、Python数据分析,从基础到项目实战!...

随着大数据和人工智能的发展,目前Python语言的上升趋势比较明显,而且由于Python语言简单易学,所以不少初学者往往也会选择Python作为入门语言。Python语言目前是IT行业内应用最为广泛的编程语言之一,尤其是近几年来随着大数据和人…

java filedialog 打开文件_java 用文件对话框打开文件

//文件的打开import java.awt.FileDialog;import java.awt.event.*;import java.io.*;import java.io.File;import java.io.FileReader;public class FileOpen {private FileDialog filedialog_open;private String fileopen null, filename null;// 用于存放打开文件地址 和…

2782: [HNOI2006]最短母串

2782: [HNOI2006]最短母串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 2[Submit][Status][Web Board]Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,…

c java 内部类_java程序中能否在内部类当中再定义一个内部类?

展开全部我被你的想62616964757a686964616fe78988e69d8331333363386664法震撼了,哈哈.亏你想的出来...这么弄代码不好理解,Java看起来醒目,也是Java中的一个规范!可以吗?必须可以..看代码演示...声明下,我也第一次,多次嵌套,看你想法后去试验下是可行的我用的两种办法!不多说看…

pythongui做计算器_python 实现简单的计算器(gui界面)

运行效果:完整代码from tkinter import *def click(num):global opopopstr(num)iptext.set(op)def evaluate():global opoutputstr(eval(op))iptext.set(output)def clearDisplay():global opop""iptext.set(op)calcTk()calc.title("TechVidvan Calc…

ios学习笔记——RunTime

Objective—C是面向运行时的语言,就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚至可以交换方法的实现。最重要的还是消息机制。 C语言使用“静态绑定”&#…

exhaustion java_Java Player.setExhaustion方法代碼示例

import org.bukkit.entity.Player; //導入方法依賴的package包/類/*** Set SamaGamesAPI*/Overridepublic void startGame(){this.getInGamePlayers().forEach(((uuid1, survivalPlayer) -> survivalPlayer.getPlayerIfOnline().closeInventory()));super.startGame();Objec…

python内存池机制_python的内存管理机制

一、python是一个什么样类型的语言1、python是一种动态解释性强类型定义的高级、通用性编程语言。解释型:执行的时候,才一条一条的解释成机器语言给计算机来执行。如:python、js、ruby、PHP等编译型:把源程序的每一条语句都编译成…

MATLAB GUI不同控件函数间变量传递方法

在GUI中一个控件函数结束后,会将在这个函数中使用的变量全部删除,如果想在另一个控件中使用,则必须想办法将这个变量保存传递,方法有以下几种:1、使用globe定义全局变量,这种方法不是很好,一方面…

java变量数据类型_java变量与数据类型

第二章 变量与数据类型变量变量的概述变量是指内存中的一个存储区域,该区域要有自己的名称(变量名)、类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值。每个变量都有自己的作用范围,叫作用域变量的注意事项1.Java中的变量必…

python实现推荐系统代码_推荐系统之矩阵分解及其Python代码实现

有如下R(5,4)的打分矩阵:(“-”表示用户没有打分)其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数那么,如何根据目前的矩阵R(5,4)如何对未打分的商品进行评分的预测(如何得到分值为0的用户的打分值)?——…

数据库分区分表以及读写分离

谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,做手头的项目以前,只聆听过分区的大名,感觉特神秘,看见某某高手在讨论会上夸夸其谈时,真是骂自己学艺不精&#x…

java第二章_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义:被java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写保留字(rese…

JSP Workshop

http://www.cnblogs.com/ITtangtang/p/4126395.html 发现http://www.tutorialspoint.com/里的资料很全也很不错啊! 资料:http://www.tutorialspoint.com/jsp/jsp_tutorial.pdf 另外,http://www.runoob.com/jsp/jsp-tutorial.html 中关于JSP…