一个使用AtomicInteger完成的Java线程同步的例子

简介: 一个使用AtomicInteger完成的Java线程同步的例子
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomIntTest {
  private AtomicInteger atomicI = new AtomicInteger(0);
  private int i = 0;
  private int unsafe = 0;
  public static void main(String[] args) {
    final AtomIntTest cas = new AtomIntTest();
    final int TOTAL_THREAD_NUM = 10;
    List<Thread> ts = new ArrayList<Thread>();
    long start = System.currentTimeMillis();
    for (int j = 0; j < TOTAL_THREAD_NUM; j++) {
      Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
          Thread.currentThread().setName(AtomIntTest.class.getName() + Thread.currentThread().getId());
          for (int i = 0; i < 1000; i++) {
            cas.count(); // i++
            cas.safeCount();
            cas.unsafeCount();
          }
          System.out.println("Thread name: " + Thread.currentThread().getName());
        }
      });
      ts.add(t);
    }
    System.out.println("total thread number: " + ts.size());
    for (Thread t : ts) { // start 600 threads
      t.start();
    }
    // 等待所有线程执行完成
    for (Thread t : ts) {
      try {
        t.join();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("safe via synchronized: " + cas.i);
    System.out.println("safe: " + cas.atomicI.get());
    System.out.println("unsafe: " + cas.unsafe);
    System.out.println(System.currentTimeMillis() - start);
  }
  /**
   * 
   * 使用CAS实现线程安全计数器
   */
  private void safeCount() {
    for (;;) {
      int i = atomicI.get();
      boolean suc = atomicI.compareAndSet(i, ++i);
      if (suc) {
        break;
      }
    }
  }
  /**
   * 
   * 非线程安全计数器
   */
  synchronized private void count() {
    i++;
  }
  private void unsafeCount() {
    unsafe++;
  }
}

image.png

相关文章
|
1天前
|
安全 Java
【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解
【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解
|
1天前
|
安全 Java
【JAVA进阶篇教学】第六篇:Java线程中状态
【JAVA进阶篇教学】第六篇:Java线程中状态
|
1天前
|
缓存 Java
【JAVA进阶篇教学】第五篇:Java多线程编程
【JAVA进阶篇教学】第五篇:Java多线程编程
|
1天前
|
Java
【JAVA基础篇教学】第十二篇:Java中多线程编程
【JAVA基础篇教学】第十二篇:Java中多线程编程
|
1天前
|
安全 Java
java-多线程学习记录
java-多线程学习记录
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
10 0
|
2天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
9 0
|
2天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
5 0
|
2天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
10 1
|
2天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
11 1