线程安全的方法
来源:互联网 发布:现代著名的网络小说家 编辑:程序博客网 时间:2024/05/21 12:46
面试问题:
下面的方法是否线程安全?怎样让它成为线程安全的方法?
class MyCounter { private static int counter = 0; public static int getCount() { return counter++; }}
本篇文章将解释一个常见的面试题,该问题被谷歌和很多其它公司问起过。它涉及的相对比较初级,而不是关于怎样去设计复杂的并发程序。
首先,这个问题的答案是No,因为counter++操作不是一个原子操作,而是由多个原子操作组成。
举个例子,在如下情况:一个线程正在访问该数据,另一个线程正在执行递增操作;
当线程Thread 1在t1时刻访问该方法,线程Thread 2有可能还没执行完这个方法的操作。因此,返回线程Thread 1的值有可能还没被递增过。
使getCount方法成为线程安全-方式一
使用关键字synchronized修饰getCount方法可以使它线程安全。当使用synchronized修饰静态方法,该类对象成为了锁。
使用synchronized就足够了吗,答案是Yes.
class MyCounter { private static int counter = 0; public static synchronized int getCount() { return counter++; }}
如果方法不是静态方法,那么使用关键字synchronized同步的将是实例对象,而不是类对象。
使getCount方法成为线程安全-方式二
在这个特殊的计数例子里,通过使用java.util.concurrent.atomic包下的AtomicInteger原子类,可以使count++操作变成原子操作,如下。
import java.util.concurrent.atomic.AtomicInteger;public class MyCounter { private static AtomicInteger counter = new AtomicInteger(0); public static int getCount() { return counter.getAndIncrement(); }}
其它一些有用的关于线程安全的事实
在Java中本地变量是线程安全的。
每一个线程都会有一个自己的栈,两个不同的线程是不会共享同一个栈的。
所有方法内部的本地变量将会在栈中分配空间,一旦当前线程的方法执行完毕,栈帧将马上被移除。
译文链接:http://www.programcreek.com/2014/02/how-to-make-a-method-thread-safe-in-java/
阅读全文
0 0
- 线程安全的方法
- 编写线程安全的方法
- 静态方法的线程安全
- 线程安全的实现方法
- 静态方法是线程安全的
- HashMap 变为线程安全的方法
- Java--java关闭线程的安全方法
- HashMap 变为线程安全的方法
- 解决servlet线程安全的方法
- 静态方法是线程安全的
- 实现线程安全的一些方法
- Java创建线程安全的方法
- Java创建线程安全的方法
- Java 静态方法是线程安全的
- Java中安全终止线程的方法
- Java创建线程安全的方法
- java中线程安全的实现方法
- 如何写线程安全的方法
- C++/Qt AES-256-CBC/ECB 加密解密
- 状态栏
- opencv环境配置----入门款
- Java Calendar 获取本周周一和周日代码
- JQuery中$.ajax()方法参数详解:
- 线程安全的方法
- 正确编写Designated Initializer的几个原则
- UE4 UMG自定义可点击区域Button
- Xamarin.Android 开发SetTextColor颜色设置
- JS控制滚动条滚动的位置
- 安装 C# 科学计算库 Math.NET Numerics
- linux下导入、导出mysql数据库命令
- 绝对差的总和(SAD)
- C++中const和#define的优缺点和c语言const的修饰的一些注意点