怎么样创建的线程才是安全的呢?带着疑问看文章
首先来看一个问题:
下面这个方法是线程安全的吗?如何才能让这个方法变成线程安全的?
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面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!
这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
- Map的线程安全与否的相关文章
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- 懒汉式的安全优化方式,两种方式。线程同时运行的时候,不会创建两个对象
- Java中线程的创建使用及其安全问题
- 黑马程序员------多线程(No.1)(概述、线程的创建、安全问题、同步锁、同步函数)
- 常见的创建线程安全单例模式的方法
- [C++11 并发编程] 12 使用条件变量创建线程间安全的队列
- Java多线程(线程创建、安全问题、生命周期)
- servlet的 线程安全问题&创建时机改变&映射细节
- 黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)
- Java的创建线程,安全,共享资源
- java线程创建和方法,及解决安全问题学习笔记
- java多线程(1):线程的创建和多线程的安全问题
- 如何创建单例模式?双重检查,不是线程安全的?如何高效的创建一个线程安全的单例
- 初学设计模式(3)-----单例模式(在研究单例的线程安全问题时,发现一篇很全面的文章,直接转了)
- 创建安全的线程
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- 多线程的安全问题。 创建线程的两种方式区别
- 创建线程的两种方式区别,安全问题
- (转)malloc、new等是线程不安全的疑问??(优化完成端口)