废话开篇

都说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如何保证方法是线程安全的的更多相关文章

  1. Java中Thread方法启动线程

    public class ThreadTest extends Thread {  private int count = 10; @Override public void run() { //重写 ...

  2. 【java】 java 中stop方法终止线程的不良后果

    stop()方法属于暴力终止线程的方法,有诸多隐患已经被废弃了. 下面演示的是stop方法会释放锁,造成数据不一致的问题. package com.xwolf.java.thread; /** * C ...

  3. Java 并发编程(四):如何保证对象的线程安全性

    01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...

  4. 线程池(Java中有哪些方法获取多线程)

    线程池(Java中有哪些方法获取多线程) 前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线 ...

  5. Java并发编程基础--基本线程方法详解

    什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...

  6. Java多线程,判断其他线程是否结束的方法

    方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...

  7. 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】

    一.创建线程的三种方式 · 继承Thread类 · 实现Runnable接口 · 实现Callable接口 二. 线程状态 · 线程名字 getName() · 线程活动情况 isAlive() · ...

  8. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  9. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

随机推荐

  1. OpenStack-Mitaka 一键安装测试环境脚本

    说明:这个脚本是采用Bash Shell编写,这个版本还只能作为测试环境搭建使用. 此脚本原形的发起人是网友:WuYuLiang.这里有他的博客链接:   第一版的链接: http://blog.cs ...

  2. 【LeetCode】8. String to Integer (atoi) 字符串转整数

    题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...

  3. Select的深入应用(2)

    首先创建两张表. 全连接 全连接:在检索时指定多个表,将每个表用逗号分隔,这样每个表的数据行都和其他表的每行交叉产生所有可能的组合,这样就是一个全连接.所有可能的组和数即每个表的行数的乘积. 或者: ...

  4. 安装node_modules文件遇到的问题:更改代理

    npm 1080 1081

  5. Does FTK index search support regular expression?

    Some of my friends ask me a question: "Does FTK index search support regular expression?" ...

  6. SpringMVC序列化Long转成String

    问题:由于JS中Number的精度为16位(最大位17位,第17位精度不准),我们的ID用的Number 18位,传到客户端会丢失最后两位: 解决方式:Long序列化成String,传到客户端: 注意 ...

  7. .NET中使用log4net

    一,加载log4net引用 下载log4net.dll,我们这里使用的是.NET2.0 下载地址:http://files.cnblogs.com/gosky/log4net-1.2.13-bin-n ...

  8. PUTTY使用Ctrl+s僵死的问题

    算是分享个小经验吧! 一直都是使用VM+PUTTY的方式调试Linux程序,有时候在Vi中编辑了程序,Windowns下旧习难改,顺手就Ctrl+s了,尽管我知道Vi的保存是:w. 很不幸这时的PUT ...

  9. 搭建高性能计算环境(六)、应用软件的安装之lammps

    1,上传需要的软件包lammps-stable.tar.gz. 2,解压缩并进入安装目录 tar xvf lammps-stable.tar.gz cd lammps-30Oct14 3,如果需要re ...

  10. js 定位到指定位置

     <script>    //滚动定位到product         function scroll() {             var scroll_offset = $(&quo ...