常用的并发包 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个 那么第六个线程必须等待前面的线程释放才能得到时间片段
本文深入探讨了Java并发编程的关键概念,包括Atomic包下对基本类型原子操作的支持,CountDownLatch和CyclicBarrier等同步工具的使用,以及Semaphore信号量在资源控制中的作用。通过对比常规线程操作与原子操作的差异,阐明了线程安全的重要性。
634

被折叠的 条评论
为什么被折叠?



