分布使用synchronized关键字和AtomicInteger进行线程同步的例子

简介: 分布使用synchronized关键字和AtomicInteger进行线程同步的例子

package atomicIntegerTest;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.Test;

public class TestAtomic {

 

 public TestAtomic(){

 

 }

  private static final int MAX_THREADS = 3;

  private static final int TASK_COUNT = 3;

  private static final int TARGET_COUNT = 100 * 10000;

  private AtomicInteger acount = new AtomicInteger(0);

  private int count = 0;

  synchronized int inc() {    

      return ++count;

  }

  synchronized int getCount() {    

      return count;

  }

class SyncThread implements Runnable {

    String name;    

    long startTime;

    TestAtomic out;    

    public SyncThread(TestAtomic o, long startTime) {                

        this.out = o;        

        this.startTime = startTime;

    }    

    @Override

    public void run() {        

      int v = out.inc();        

      // System.out.println("Value after inc: " + v + " Thread id: " + Thread.currentThread().getId());

      while (v < TARGET_COUNT) {

            v = out.inc();

      }        

      long endTime = System.currentTimeMillis();

      System.out.println("SyncThread spend:" + (endTime - startTime) + "ms" + ", v=" + v + " Thread id: " + Thread.currentThread().getId());

    }

}

class AtomicThread implements Runnable {

    String name;    

    long startTime;    

    public AtomicThread(long startTime) {        

       this.startTime = startTime;

    }    

    @Override  

    public void run() {        

       int v = acount.incrementAndGet();        

       while (v < TARGET_COUNT) {

            v = acount.incrementAndGet();

        }        

        long endTime = System.currentTimeMillis();

        System.out.println("AtomicThread spend:" + (endTime - startTime) + "ms" + ", v=" + v + " Thread id: " + Thread.currentThread().getId());

    }

}

@Test

public void testSync() throws InterruptedException {

    ExecutorService exe = Executors.newFixedThreadPool(MAX_THREADS);    

    long startTime = System.currentTimeMillis();

    SyncThread sync = new SyncThread(this, startTime);    

    for (int i = 0; i < TASK_COUNT; i++) {

        exe.submit(sync);

    }

    Thread.sleep(1000);

}

@Test

public void testAtomic() throws InterruptedException {

    ExecutorService exe = Executors.newFixedThreadPool(MAX_THREADS);    

    long startTime = System.currentTimeMillis();

    AtomicThread atomic = new AtomicThread(startTime);    

    for (int i = 0; i < TASK_COUNT; i++) {

        exe.submit(atomic);

    }

    Thread.sleep(1000);

}

}

image.png

目录
相关文章
|
3月前
|
安全 Java 程序员
synchronized关键字与ReentrantLock的区别和应用
synchronized关键字与ReentrantLock的区别和应用
20 0
|
3月前
|
存储 安全 Java
synchronized 与多线程的哪些关系
synchronized 与多线程的哪些关系
30 0
|
6月前
|
监控 安全 Java
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
|
6月前
|
Java 程序员
在Synchronized和ReentrantLock之间选择
在Synchronized和ReentrantLock之间选择
23 0
|
6月前
|
存储 安全 Java
JUC第五讲:关键字synchronized详解
JUC第五讲:关键字synchronized详解
|
9月前
|
Java
synchronized 关键字对于锁的一些优化
synchronized 关键字对于锁的一些优化
41 0
|
9月前
|
安全 Java 编译器
volatile 与 synchronized 关键字的区别?
volatile 与 synchronized 关键字的区别?
41 0
|
11月前
|
Java
synchronized和reentrantlock之间的区别
synchronized和reentrantlock之间的区别
|
11月前
|
Java 编译器
synchronized关键字(作用 + 特点 + 锁升级 + 锁优化 + 与 volatile 对比)
1. synchronized 的作用 1)保证原子性 2)保证内存可见性 3)保证有序性 2. synchronized 特点 3. 锁升级的过程 1)偏向锁 2)轻量级锁 3)重量级锁 4. 锁的优化操作 1)锁消除 2)锁粗化 5. synchronized 使用示例 1)修饰普通方法:锁当前实例对象 2)修饰静态方法:锁当前类对象 3)修饰代码块:指定锁哪个对象 6. volatile 的作用 1)保证内存可见性 2)保证有序性 7. synchronized 和 volatile 的区别
76 0
synchronized关键字(作用 + 特点 + 锁升级 + 锁优化 + 与 volatile 对比)