原子类保证多线程环境下的数据安全的示例

原子类保证多线程环境下的数据安全的示例

 

1、原子整型类保证多线程环境下的数据安全示例:

package com.joyupx.cms.example.thread.concurrent.atomic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 原子性操作
 * 多线程环境下保障数据安全。
 */
@Slf4j
public class AtomicIntegerIncrementExample {

    private static AtomicInteger num = new AtomicInteger(0);

    public static void main(String[] args) {
        Thread incrementThreadA = new Increment();
        Thread incrementThreadB = new Increment();

        incrementThreadA.start();
        incrementThreadB.start();

        try {
            incrementThreadA.join();
            incrementThreadB.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        // 值只要小于 20000 = 2 * 1000 就表示是非原子操作。
        log.info("num = {}", num);
    }

    static class Increment extends Thread {
        @Override
        public void run() {
            log.info("{} 自增前 num = {}", Thread.currentThread().getName(), num);

            /*
             * 数量太少了看不出来,所以这里给了 10000 次递增。
             * 具体次数取决于具体的硬件,比如 CPU、内存、线程数等,请酌情考虑。
             */
            for (int index = 0; index < 10000; ++index) {
                num.incrementAndGet();
            }

            log.info("{} 自增后 num = {}", Thread.currentThread().getName(), num.get());
        }
    }
}

  

 

2、原子长整型类保证多线程环境下的数据安全示例:

package com.joyupx.cms.example.thread.concurrent.atomic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicLong;

/**
* 原子性操作
* 多线程环境下保障数据安全。
*/
@Slf4j
public class AtomicLongIncrementExample {

private static AtomicLong num = new AtomicLong(0);

public static void main(String[] args) {
Thread incrementThreadA = new Increment();
Thread incrementThreadB = new Increment();

incrementThreadA.start();
incrementThreadB.start();

try {
incrementThreadA.join();
incrementThreadB.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

// 值只要小于 20000 = 2 * 1000 就表示是非原子操作。
log.info("num = {}", num);
}

static class Increment extends Thread {
@Override
public void run() {
log.info("{} 自增前 num = {}", Thread.currentThread().getName(), num);

/*
* 数量太少了看不出来,所以这里给了 10000 次递增。
* 具体次数取决于具体的硬件,比如 CPU、内存、线程数等,请酌情考虑。
*/
for (int index = 0; index < 10000; ++index) {
num.incrementAndGet();
}

log.info("{} 自增后 num = {}", Thread.currentThread().getName(), num.get());
}
}
}

  

posted @ 2024-11-14 16:13  hapday  阅读(4)  评论(0编辑  收藏  举报