电子商务网站建设方案推荐会员卡管理系统免费版
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:23
当前位置: 首页 > news >正文
电子商务网站建设方案推荐,会员卡管理系统免费版,品牌推广方案,南宁市平台公司并发编程 1.共享模型-内存 共享变量在多线程间的可见性问题与多条指令执行时的有序性问题 1.1Java内存模型 JMM它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存CPU指令优化等. JMM体现在#xff1a; 原子性-保证指令不会受到线程上…并发编程 1.共享模型-内存 共享变量在多线程间的可见性问题与多条指令执行时的有序性问题 1.1Java内存模型 JMM它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存CPU指令优化等. JMM体现在 原子性-保证指令不会受到线程上下文切换的影响可见性-保证指令不会受cpu缓存的影响有序性-保证指令不会受cpu指令并行优化的影响 1.2可见性 问题通过变量控制while程序不能够停下来 Slf4j public class KeJianXingThreadD2 {static boolean flag true;public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() - {while (flag) {}});thread.start();Thread.sleep(3);log.debug(停止thread);flag false;} }分析问题 thread从内存读取了flag的值到工作内存中thread线程频繁从主内存中读取flag的值,JIT编译器会将flag的值缓存到自己的工作内存中,减少对主内存中flaga的访问,提高效率3秒之后,main线程修改了flag的值,并同步到主内存中,而thread线程一直在读取自己的工作内存的值一直是旧值所以线程不会停下来 解决方案 volatile(关键字) 可以修饰成员变量和静态成员变量,可以避免线程从自己的工作缓存中查找变量,必须到主内存获取它的值,线程操作volatile变量都是直接操作主 public class KeJianXingThreadD2 {volatile static boolean flag true;public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() - {while (flag) {}});thread.start();Thread.sleep(3);log.debug(停止thread);flag false;} }只能保证可见性 不能保证原子性 1.3有序性 程序执行的顺序按照代码的先后执顺序执行. 编译器和处理器为了提高执行的效率性能,会对执行进行重排序,指令重排序对单线程应用没有影响但是在多线程环境下可能出现问题.重排序的代码没有执行完 解决volatile关键字解决 1.4volatile原理 读屏障写屏障 2.共享模型-无锁 CAS与volatile原子整数原子引用原子累加器Unsafe 2.1CAS与volatile /*** program: springboot-demo-liuan* description:* author: Mr.Lh* create: 2023-03-18 21:29**/ public class CasController {public static void main(String[] args) throws InterruptedException {Acout acout new Acout(10000);acout.demo(acout);} }class Acout {public AtomicInteger balance;public Acout(int count) {this.balance new AtomicInteger(count);}public void with(Integer amout) {while (true) {int i balance.get();int b i - amout;if (balance.compareAndSet(i, b)) {break;}}}void demo(Acout acout) throws InterruptedException {for (int i 0; i 1000; i) {new Thread(()-{acout.with(10);}).start();}Thread.sleep(1000);System.out.println(acout.balance.get());} }关键点是compareAndSet,它的简称是CAS,它必须是原子性的操作 CAS特点 CAS和volatile可以实现无锁并发,适用于线程数小,多核CPU的场景下 CAS是基于乐观锁的思想synchronized是基于悲观锁的思想CAS体现的是无锁并发,无阻塞并发 CAS缺点 ABA问题A值变成了B,然后又从B值变回了A,而使用CAS并不会感知到这个情况自旋时间过长单次CAS并一定能够成功,CAS配合循环来使用 原子整数 AtomicIntegerAtomicBooleanAtomicLong 原子引用 AtomicReference(会有ABA的问题)AtomicStampedReference(版本号解决ABA的问题) 3.线程池 1.线程池状态 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态低 29 位表示线程数量 状态名高 3 位接收新任务处理阻塞队列任务说明RUNNING111YYSHUTDOWN000NY不会接收新任务但会处理阻塞队列剩余 任务STOP001NN会中断正在执行的任务并抛弃阻塞队列 任务TIDYING010–任务全执行完毕活动线程为 0 即将进入 终结TERMINATED011–终结状态 2.构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueRunnable workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) corePoolSize 核心线程数maximumPoolSize 最大线程数keepAliveTime 生存时间unit 生存时间单位workQueue 当核心线程数满时,存放的任务队列threadFactory 创建线程的工厂handler 拒绝策略 四种策略 CallerRunsPolicy 让调用者运行任务DiscardOldestPolicy 放弃队列中最早的任务,本任务取而代之AbortPolicy 让调用者抛出异常 默认策略DiscardPolicy 放弃本次任务 工厂创建线程 1.newFixedThreadPool 特点 核心线程数最大线程数,无需超时时间阻塞队列是无界的,可以任意数量的任务 2.newCachedThreadPool 特点 核心线程数是0,最大线程数无限制,60s回收救急线程,救济线程可以无限的创建队列采用的SynchronousQueue 没有容量,没有线程来取是放不进去的没有上限的一个线程池 3.newSingleThreadExecutor 特点 线程数固定为1,会放入无界队列中,任务执行完毕,这唯一的线程也不会被释放 任务调度线程池 //延时执行任务 public class TimeExcetor {public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService Executors.newScheduledThreadPool(2);scheduledExecutorService.schedule(() - {System.out.println(aaaa);}, 2, TimeUnit.MILLISECONDS);scheduledExecutorService.schedule(() - {System.out.println(bbbbbb);}, 1, TimeUnit.MILLISECONDS);} }//定时执行任务 Slf4j public class TimeExcetor {public static void main(String[] args) {ScheduledExecutorService pool Executors.newScheduledThreadPool(1);log.debug(start…);pool.scheduleAtFixedRate(() - {log.debug(running…);}, 1, 1, TimeUnit.SECONDS);} }正确处理执行任务异常 主动捕获异常 public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService Executors.newScheduledThreadPool(2);scheduledExecutorService.execute(() - {try {int i 10 / 0;} catch (Exception ex) {ex.printStackTrace();}System.out.println(aaa);}); }Future public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService Executors.newFixedThreadPool(2);FutureBoolean submit executorService.submit(() - {int i 10 / 0;return true;});//如果任务执行成功则获取值,如果任务失败了 则会打印出异常信息System.out.println(submit.get()); }4.JUC 4.1 AQS原理 AbstractQueuedSynchronizer是一个用于实现锁和同步器的基础框架 特点 state state 表示同步状态(分独占锁和共享锁) 使用compareAndSetState机制实现加锁Node表示队列元素每个 Node 对象内都保存着当前线程的引用这些 Node 构成了一个双向队列 4.2ReentrantReadWriteLock ReentrantReadWriteLock 同样基于 AQS 实现了一套高效的同步机制。它维护着两个锁一个读取锁和一个写入锁。读取锁允许多个线程同时共享读操作而写入锁则只允许一个线程进行写入操作。如果有一个线程已经获取了写入锁那么其他所有线程都无法获得读取或写入锁它们只能等待写入锁被释放后才能进行读取或写入操作。 4.3Semaphore 是一种在并发编程中经常使用的同步原语。它可以用来管理一组共享的资源防止共享资源的并发使用。Semaphore包含一个计数器和两个方法acquire和release Slf4j public class SemaphoreDemo1 {public static void main(String[] args) {Semaphore semaphore new Semaphore(2);for (int i 0; i 10; i) {new Thread(()-{try {semaphore.acquire();log.info(获取信号量);Thread.sleep(10002);} catch (InterruptedException e) {throw new RuntimeException(e);}finally {semaphore.release();}}).start();}} }4.4CountDownLatch 是一个同步工具它可以让一个线程等待一组操作的完成。CountDownLatch包含一个计数器和两个方法countDown和await countDown方法将计数器的值减一await方法阻塞线程直到计数器值为零。每次调用countDown方法都会减少计数器的值当计数器值为零时await方法会解除所有等待线程的阻塞状态 Slf4j public class CountDownLatchDemo1 {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch new CountDownLatch(3);new Thread(()-{try {Thread.sleep(1000);countDownLatch.countDown();} catch (InterruptedException e) {throw new RuntimeException(e);}}).start();new Thread(()-{try {Thread.sleep(2222);} catch (InterruptedException e) {throw new RuntimeException(e);}countDownLatch.countDown();}).start();new Thread(()-{try {Thread.sleep(3333);} catch (InterruptedException e) {throw new RuntimeException(e);}countDownLatch.countDown();}).start();//主线程阻塞countDownLatch.await();} }4.5CyclicBarrier 循环栅栏用来进行线程协作等待线程满足某个计数。构造时设置『计数个数』每个线程执 行到某个需要“同步”的时刻调用 await() 方法进行等待当等待的线程数满足『计数个数』时继续执行 public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cb new CyclicBarrier(2); // 个数为2时才会继续执行new Thread(()-{System.out.println(线程1开始..new Date());try {cb.await(); // 当个数不足时等待} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}System.out.println(线程1继续向下运行…new Date());}).start();new Thread(()-{System.out.println(线程2开始..new Date());try { Thread.sleep(2000); } catch (InterruptedException e) { }try {cb.await(); // 2 秒后线程个数够2继续运行} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}System.out.println(线程2继续向下运行…new Date());}).start();} }
相关文章
-
电子商务网站建设方案目录做一个app需要多少钱一个
电子商务网站建设方案目录做一个app需要多少钱一个
- 技术栈
- 2026年03月21日
-
电子商务网站建设方案范文教育网站制作要多少钱
电子商务网站建设方案范文教育网站制作要多少钱
- 技术栈
- 2026年03月21日
-
电子商务网站建设调研报告西安百度seo代理
电子商务网站建设调研报告西安百度seo代理
- 技术栈
- 2026年03月21日
-
电子商务网站建设分析wordpress更换域名缩略图不显示
电子商务网站建设分析wordpress更换域名缩略图不显示
- 技术栈
- 2026年03月21日
-
电子商务网站建设分析中国建筑招聘官方网站
电子商务网站建设分析中国建筑招聘官方网站
- 技术栈
- 2026年03月21日
-
电子商务网站建设服务外包专业的网站建设服务交易平台
电子商务网站建设服务外包专业的网站建设服务交易平台
- 技术栈
- 2026年03月21日






