Java多线程从入门到精通
文章平均质量分 80
从应用到源码,由浅入深,深入理解Java多线程原理,并追踪多个JUC中核心类的源码,最终掌握多线程的运用以及底层的运行的流程和源码分析
arden.WANG
Java初级开发者
展开
-
并发编程三大特性:3、有序性
在Java中,.java文件中的内容会被编译,在执行前需要再次转为CPU可以识别的指令,CPU在执行这些指令时,为了提升执行效率,在不影响最终结果的前提下(满足一些要求),会对指令进行重排。指令乱序执行的原因,是为了尽可能的发挥CPU的性能。Java中的程序是乱序执行的。b = 0;x = 0;y = 0;a = 1;x = b;});b = 1;y = a;});t1.start();t2.start();t1.join();t2.join()原创 2023-05-17 15:46:47 · 74 阅读 · 0 评论 -
并发编程三大特性:1、原子性
不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。让Java的并发编程可以做到跨平台。JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。i < 100;i++) {原创 2023-05-17 15:42:40 · 303 阅读 · 0 评论 -
并发编程三大特性:2、可见性(什么是可见性、解决可见性的方式)
可见性问题是基于CPU位置出现的,CPU处理速度非常快,相对CPU来说,去主内存获取数据这个事情太慢了,CPU就提供了L1,L2,L3的三级缓存,每次去主内存拿完数据后,就会存储到CPU的三级缓存,每次去三级缓存拿数据,效率肯定会提升。这就带来了问题,现在CPU都是多核,每个线程的工作内存(CPU三级缓存)都是独立的,会告知每个线程中做修改时,只改自己的工作内存,没有及时的同步到主内存,导致数据不一致问题。可见性问题的代码逻辑// ....System.out.println("t1线程结束");原创 2023-05-17 15:44:17 · 471 阅读 · 0 评论 -
线程的使用(线程状态、常见方法、结束方式)
如果在main线程中调用了t1.join(2000),那么main线程会进入到等待状态,需要等待t1执行2s后,在恢复到就绪状态等待CPU调度。如果在main线程中调用了t1.join(),那么main线程会进入到等待状态,需要等待t1线程全部执行完毕,在恢复到就绪状态等待CPU调度。可以让获取synchronized锁资源的线程,通过notify或者notifyAll方法,将等待池中的线程唤醒,添加到。线程结束方式很多,最常用就是让线程的run方法结束,无论是return结束,还是抛出异常结束,都可以。原创 2023-05-17 15:39:29 · 303 阅读 · 0 评论 -
线程的创建方式
启动线程是调用start方法,这样会创建一个新的线程,并执行线程的任务。如果直接调用run方法,这样会让当前线程执行run方法中的业务逻辑。Callable一般用于有返回结果的非阻塞的执行方法。追其底层,其实只有一种,实现Runnble。原创 2023-05-17 15:30:16 · 80 阅读 · 1 评论 -
多线程基础概念
这里的并发并不是三高中的高并发问题,这里是多线程中的并发概念(CPU调度线程的概念)。CPU在极短的时间内,反复切换执行不同的线程,看似好像是并行,但是只是CPU高速的切换。不如要处理一个网络等待的操作,开启一个线程去处理需要网络等待的任务,让当前业务线程可以继续往下执行逻辑,效率是可以得到大幅度提升的。烧水开始执行后,不需要一直等待水烧开,可以去执行其他功能,但是需要时不时的查看水开了没。异步非阻塞这个效果是最好的,平时开发时,提升效率最好的方式就是采用异步非阻塞的方式处理一些多线程的任务。原创 2023-05-17 15:27:53 · 90 阅读 · 0 评论