在Java如何保证方法是线程安全的
废话开篇
都说Java程序好些,但是我觉得Java编程这东西,没个十年八年的真不敢说自己精通Java编程,由于工作原因,开始转战Java多线程,以前没怎么接触过,所以想留点脚印在这两条路上。
切入正题
开门见山,今天看到别人写的一段关于方法是否线程安全的文章,比较简单,但是由于自己也是刚开始入门,所以就迈下了第一步。由于注释还算比较详细,所以就不废话了,直接上code。
此方法不是线程安全的
/**
* @Title: NotThreadSafeCounter.java
* @Package never.uncategory
* @Description: * The method is not thread-safe, because the
* counter++ operation is not atomic, which means it consists
* more than one atomic operations. In this case, one is
* accessing value and the other is increasing the value by one.
* @author "Never" xzllc2010#gmail.com
* @date Mar 14, 2014 7:44:24 PM
*/
/* */
package never.uncategory; public class NotThreadSafeCounter extends Thread { private static int counter = 0; public void run() {
System.out.println("counter:" + getCount());
} public static int getCount() { try {
Thread.sleep(1500);
} catch (Exception e) {
e.printStackTrace();
}
return counter++; } public static void main(String[] args) { for (int i = 0; i < 5; i++) {
new NotThreadSafeCounter().start();
}
} }
此方法是线程安全的(synchronized)
/**
* @Title: ThreadSafeCounter.java
* @Package never.uncategory
* @Description: Adding synchronized to this method will makes
* it thread-safe,When synchronized is added to a static method,
* the Class object is the object which is locked.If the method
* is not static, then adding synchronized keyword willsynchronize
* the instance of the class, not the Class object.
* @author "Never" xzllc2010#gmail.com
* @date Mar 14, 2014 8:09:45 PM
*/
package never.uncategory; public class ThreadSafeCounter { private static int counter = 0; public void run() {
System.out.println("counter:" + getCount());
} public static synchronized int getCount() {
return counter++;
} public static void main(String[] args) { for (int i = 0; i < 5; i++) {
new NotThreadSafeCounter().start();
}
} }
此方法也是线程安全的(AtomicInteger)
/**
* @Title: ThreadSafeCounter2.java
* @Package never.uncategory
* @Description: using AtomicInteger for safe counter
* @author "Never" xzllc2010#gmail.com
* @date Mar 14, 2014 8:14:33 PM
*/
package never.uncategory; import java.util.concurrent.atomic.AtomicInteger; public class ThreadSafeCounter2 { private static AtomicInteger counter = new AtomicInteger(0); public void run() {
System.out.println("counter:" + getCount());
} public static int getCount() {
return counter.getAndIncrement();
} public static void main(String[] args) { for (int i = 0; i < 5; i++) {
new NotThreadSafeCounter().start();
}
}
}
时光的尾巴
刚入门,如有疑问,多指教和交流。
在Java如何保证方法是线程安全的的更多相关文章
- Java中Thread方法启动线程
public class ThreadTest extends Thread { private int count = 10; @Override public void run() { //重写 ...
- 【java】 java 中stop方法终止线程的不良后果
stop()方法属于暴力终止线程的方法,有诸多隐患已经被废弃了. 下面演示的是stop方法会释放锁,造成数据不一致的问题. package com.xwolf.java.thread; /** * C ...
- Java 并发编程(四):如何保证对象的线程安全性
01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...
- 线程池(Java中有哪些方法获取多线程)
线程池(Java中有哪些方法获取多线程) 前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线 ...
- Java并发编程基础--基本线程方法详解
什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...
- Java多线程,判断其他线程是否结束的方法
方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...
- 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】
一.创建线程的三种方式 · 继承Thread类 · 实现Runnable接口 · 实现Callable接口 二. 线程状态 · 线程名字 getName() · 线程活动情况 isAlive() · ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
随机推荐
- 关于NopCommerce3.6版的@Html.Widget(“home_page_top”)的说明
以首页幻灯片为例子,首页幻灯片是在插件Nop.Plugin.Widgets.NivoSlider里面实现的 首页视图位置 这里其实是加载插件里面的视图内容,具体实现在插件实现 这个是扩展方法,就是执行 ...
- How to deploy JAVA Application on Azure Service Fabric
At this moment, Azure Service Fabric does not support JAVA application natively (but it's on the sup ...
- while((c = getchar()) != EOF)(键盘输入问题)
问题描述: 样例输入:O S 样例输出:I A 代码实现: #include <stdio.h> char *s = "`1234567890-=qwertyuiop[]\\as ...
- linux配置tns
.三个配置文件都是放在$ORACLE_HOME\network\admin目录下. .sqlnet.ora确定解析方式 .listener.ora上设SID_NAME,通常用于JDBC访问,对应的错误 ...
- 数据结构(一)之HelloWord
最近由于学习上面的需要,要重新的看看数据结构方面的知识!当然,我觉得数据结构也非常的重要,下面是我的学习的一点小小的记录,以备日后的查看! 我的环境: 1:操作系统:windows7 2:编码环境:M ...
- BZOJ1029 建筑抢修
Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重 ...
- TCP/IP详解学习笔记(2)-- 数据链路层
1.概述 数据链路层属于计算机网络的底层,使用的信道主要有点对点信道和广播信道两种类型. 在TCP/IP协议族中,数据链路层主要有三个目的: 1)为IP模块发送 ...
- Linux之通配符与转义字符
通配符: *:代表任意字符,可以为空字符 ?:代表一个字符,不可以为空字符 转义字符: \
- Spring MVC防御CSRF、XSS和SQL注入攻击
参考: http://www.myhack58.com/Article/html/3/7/2012/36142_6.htm http://blog.csdn.net/jasontome/article ...
- 将Windows 7导航窗格中的收藏夹、库、家庭组、网络全部去掉
将Windows 7导航窗格中的收藏夹.库.家庭组.网络全部去掉,只剩下计算机.右键单击ShellFolder,选择权限->Administrators,勾选上“完全控制”,确定后双击右侧窗格中 ...