java并发包concurrent之Atomic,CountDownLatch,CyclicBarrier,Semaphore

本文深入探讨了Java并发编程的关键概念,包括Atomic包下对基本类型原子操作的支持,CountDownLatch和CyclicBarrier等同步工具的使用,以及Semaphore信号量在资源控制中的作用。通过对比常规线程操作与原子操作的差异,阐明了线程安全的重要性。

常用的并发包 Atomic

常用的并发类CountDownLatch,CyclicBarrier,Semaphore

Atomic:分析下面代码

常规的demo
public class Test002 {
    public static void main(String[] args) {
        automicThread[] ac = new automicThread[10];
        for (int i = 0; i < ac.length; i++) {
            ac[i] = new automicThread();
            ac[i].start();
        }
    }
}

class automicThread extends Thread {
    private static int count = 0;

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            count++;
        }
        System.out.println(getName() + "-------" + count);
    }
}

 

 输出结果为:

 Thread-0-------2633
Thread-7-------4633
Thread-3-------2633
Thread-1-------3633
Thread-2-------3633
Thread-5-------5633
Thread-9-------6633
Thread-8-------8008
Thread-4-------9071
Thread-6-------8071  此过程中出现了线程安全问题,说明没有同步 static volitate关键字均没保证数据的安全性 只是保证数据及时共享

 

Automic并发包下面的对八大基本类型的并发原子类实现保证数据的原子性。

public class Test002 {
    public static void main(String[] args) {
        automicThread[] ac = new automicThread[10];
        for (int i = 0; i < ac.length; i++) {
            ac[i] = new automicThread();
            ac[i].start();
        }
    }
}
class automicThread extends Thread {
    private static AtomicInteger count = new AtomicInteger();

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            count.incrementAndGet(); 相当于++操作 java本身的++操作是不安全的 
        }
        System.out.println(getName() + "-------" + count);
    }
}

输出结果如下

 

Thread-1-------1000
Thread-0-------2000
Thread-7-------3000
Thread-2-------4000
Thread-6-------5120
Thread-5-------6000
Thread-9-------7000
Thread-8-------8834
Thread-3-------9000
Thread-4-------10000

AtomicInteger保证数据的原子性,具体实现这里不作说明。

CountDownLatch:(记数器)是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行

 如何将线程按照自己想要的顺序执行:CountDownLatch设置基数量 当 countDownLatch.countDown()满足大于0 则用不会执行 countDownLatch.await()后面的代码。保证线程与线程之间的同步执行操作 如下 正常情况 System.out.println("主线程执行完毕");必会先执行输出

  public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);//初始化2个计数器

        new Thread() {
            @Override
            public void run() {
                countDownLatch.countDown();//计数器减1

                System.out.println("我是子线程");

            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                countDownLatch.countDown();//计数器减1

                System.out.println("我是子线程");

            }
        }.start();
        countDownLatch.await();//当 countDownLatch.countDown();减少到0时候才执行以下代码
        System.out.println("主线程执行完毕");
    }

}

CyclicBarrier:(记数器)与CountDownLatch类似

Semaphore:信号量Semaphore semaphore = new Semaphore(5);表示抢资源,当前线程如果大于5个 那么第六个线程必须等待前面的线程释放才能得到时间片段

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值