线程安全的atomic wrapper classes例子

先参考一个例子 http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html#!comments

即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。

使用AtomicInteger,它封装了一些integer的原子操作,并使之线程安全

package threadTest;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerTestApp1 {
    public static AtomicInteger count = new AtomicInteger(0);

    public static void inc() {

//      count++;
        count.incrementAndGet();
    }

    public static void main(String[] args) throws InterruptedException {

        ExecutorService service= Executors.newFixedThreadPool(Integer.MAX_VALUE);

        for (int i = 0; i < 10000; i++) {
            service.execute(new Runnable() {
                @Override
                public void run() {
                    ThreadPoolTestApp1.inc();
                }
            });
        }

        service.shutdown();
        //给予一个关闭时间(timeout),但是实际关闭时间应该会这个小
        service.awaitTermination(300, TimeUnit.SECONDS);

        System.out.println("运行结果:Counter.count=" + ThreadPoolTestApp1.count);
    }
}

Java中的原子操作包括:
1)除long和double之外的基本类型的赋值操作
2)所有引用reference的赋值操作
3)java.concurrent.Atomic.* 包中所有类的一切操作
count++不是原子操作,是3个原子操作组合
1.读取主存中的count值,赋值给一个局部成员变量tmp
2.tmp+1
3.将tmp赋值给count

时间: 2024-09-30 11:08:41

线程安全的atomic wrapper classes例子的相关文章

一步一步掌握线程机制(六)---Atomic变量和Thread局部变量

一步一步掌握线程机制(六)---Atomic变量和Thread局部变量 前面我们已经讲过如何让对象具有Thread安全性,让它们能够在同一时间在两个或以上的Thread中使用.Thread的安全性在多线程设计中非常重要,因为race condition是非常难以重现和修正的,我们很难发现,更加难以改正,除非将这个代码的设计推翻来过. 同步最大的问题不是我们在需要同步的地方没有使用同步,而是在不需要同步的地方使用了同步,导致效率极度低下.所以,我们要想办法限制同步,因为无谓的同步比起无谓的运算还更

为什么会有多线程?什么是线程安全?如何保证线程安全?(带详细例子)

本文将会回答这几个问题: 为什么会有多线程? 什么是线程安全? 怎么样保证线程安全? 为什么会有多线程 显然,线程安全的问题只会出现在多线程环境中,那么为什么会有多线程呢? 最早期的计算机十分原始,还没有操作系统.想要使用计算机时,人们先把计算机可以执行的指令刻在纸带上,然后让计算机从纸带上读取每一条指令,依次执行.这时候的计算机每次只能执行一个任务,是地地道道的单线程. 这种情况下就产生了三个问题: 1. 计算资源的严重浪费 计算机在执行任务时,总少不了一些输入输出操作,比如计算结果的打印等.

线程间共享数据的一个例子

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 题目分析: 一.如果数组中全部为负数,则返回最大负数值即可 二.当既有正数也有负数的时候: (1)从左往右叠加,如果当前叠加值小于或者等于0,则放弃,叠加总和清0(加一个负数或者0是毫无意义的),从此位置继续重新叠加 (

[Java] 基本資料包裝類別 Wrapper Classes

基本型別包裝 (Wrapper Classes) 將基本型別生成物件,要將基本型別先包裝成物件,才能執行生成, Boxing: Integer a = new Integer(1) Unboxing: int x = a.intValue() Autoboxing(JDK1.5以後支援) Integer a  = 1  [物 <= 基] ok int x = new Integer(1)    [基 <= 物] ok 獲取其值     xxxValue() % Byte / Short / I

java中什么是线程不安全给出一个例子

下面我们再给出一个线程不安全的例子. (视频下载) (全部书籍) 例:1.8.2-本章源码 class BookMark_to_win {    int bookNum=10;    void onlySellOne() {        if (bookNum > 0) {            System.out.println(Thread.currentThread().getName()                    + " before" + bookNum

3、传统线程同步与通信--生产消费例子

核心点: 1.锁对象必须是同一个. 2.wait()和notify()方法必须是调用锁对象的方法,而非this(线程)的. 3.在多生产多消费的时候注意使用notifyAll而不是notifyAll,否则会造成死锁 测试代码: 1 import java.util.LinkedList; 2 import java.util.Queue; 3 import java.util.Random; 4 5 /** 6 * 多个生产 - 消费 线程同步通信 7 * 核心点: 8 * 1.锁对象必须是同一

Thread线程的方法用法,有代码例子,简单易懂

/** *  程序 :  *      就是指我们写的保存硬盘当中的静态文件,叫程序 *  进程 :   *      就是程序被加载进内存,准备或者正在运行时,就叫进程 *  线程 :  *      就是程序中不同的执行路径 * *  线程 :  *      当我们程序开始执行的时候,就是java中main()方法开始执行,在栈内存中开辟main()栈帧的时候,就是开启了一个线程 *      一个线程就是一个栈及其里面的链式栈帧,一个栈帧就对应一个方法. *   */☆☆☆☆ 重点 ☆☆

C++ RAII手法实现的线程安全的日志文件写例子

#include <iostream> #include <fstream> #include <string> #include <cstdarg> #include <cstdio> #include <pthread.h> // MutexLock 封装互斥锁的接口 class MutexLock { public: MutexLock() { pthread_mutex_init(&mutex_, NULL); } M

C/C++ 线程同步安全队列简单实现例子

#ifndef MUTEXLOCKER_H_INCLUDED #define MUTEXLOCKER_H_INCLUDED #include <pthread.h> #include <stdexcept> class MutexLocker{ public: explicit MutexLocker(pthread_mutex_t *mutex):m_mutex(mutex){ int ret = pthread_mutex_lock(m_mutex); if(ret != 0)