
Java多线程
勤奋的凯尔森同学
这个作者很懒,什么都没留下…
展开
-
10、谈一谈 volatile
小景哥哥博客 谈一谈 volatile JMM 为 volatile 定义了一些特殊访问规则,当变量被定义为 volatile 后具备两种特性: 保证变量对所有线程可见 当一条线程修改了变量值,新值对于其他线程来说是立即可以得知的。volatile 变量在各个线程的工作内存中不存在一致性问题,但 Java 的运算操作符并非原子操作,导致 volatile 变量运算在并发下仍不安全。 禁止指令重排序优化 使用 volatile 变量进行写操作,汇编指令带有 lock 前缀,相当于一个内存屏障,后面的指原创 2021-03-10 20:24:01 · 210 阅读 · 2 评论 -
9、原子性、可见性、有序性分别是什么?
小景哥哥博客 原子性、可见性、有序性分别是什么? 原子性 基本数据类型的访问都具备原子性,例外就是 long 和 double,虚拟机将没有被 volatile 修饰的 64 位数据操作划分为两次 32 位操作。 如果应用场景需要更大范围的原子性保证,JMM 还提供了 lock 和 unlock 操作满足需求,尽管 JVM 没有把这两种操作直接开放给用户使用,但是提供了更高层次的字节码指令 monitorenter 和 monitorexit,这两个字节码指令反映到 Java 代码中就是 synchron原创 2021-03-10 20:22:43 · 725 阅读 · 1 评论 -
8、什么是指令重排序?
小景哥哥博客 什么是指令重排序? 为了提高性能,编译器和处理器通常会对指令进行重排序,重排序指从源代码到指令序列的重排序,分为三种:① 编译器优化的重排序,编译器在不改变单线程程序语义的前提下可以重排语句的执行顺序。② 指令级并行的重排序,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。③ 内存系统的重排序。 ...原创 2021-03-10 20:21:36 · 558 阅读 · 0 评论 -
7、as-if-serial 和 happens-before 有什么区别?
小景哥哥博客 as-if-serial 和 happens-before 有什么区别? as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不变。 这两种语义的目的都是为了在不改变程序执行结果的前提下尽可能提高程序执行并行度。 ...原创 2021-03-10 20:20:31 · 281 阅读 · 0 评论 -
6、happens-before 是什么?
小景哥哥博客 happens-before 是什么? 先行发生原则,JMM 定义的两项操作间的偏序关系,是判断数据是否存在竞争的重要手段。 JMM 将 happens-before 要求禁止的重排序按是否会改变程序执行结果分为两类。对于会改变结果的重排序 JMM 要求编译器和处理器必须禁止,对于不会改变结果的重排序,JMM 不做要求。 JMM 存在一些天然的 happens-before 关系,无需任何同步器协助就已经存在。如果两个操作的关系不在此列,并且无法从这些规则推导出来,它们就没有顺序性保障,虚拟机原创 2021-03-10 20:18:50 · 199 阅读 · 2 评论 -
5、as-if-serial 是什么?
小景哥哥博客 as-if-serial 是什么? 不管怎么重排序,单线程程序的执行结果不能改变,编译器和处理器必须遵循 as-if-serial 语义。 为了遵循 as-if-serial,编译器和处理器不会对存在数据依赖关系的操作重排序,因为这种重排序会改变执行结果。但是如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。 as-if-serial 把单线程程序保护起来,给程序员一种幻觉:单线程程序是按程序的顺序执行的。 ...原创 2021-03-10 20:16:56 · 657 阅读 · 0 评论 -
4、JMM 的作用是什么?
小景哥哥博客 JMM 的作用是什么? Java 线程的通信由 JMM 控制,JMM 的主要目的是定义程序中各种变量的访问规则。变量包括实例字段、静态字段,但不包括局部变量与方法参数,因为它们是线程私有的,不存在多线程竞争。JMM 遵循一个基本原则:只要不改变程序执行结果,编译器和处理器怎么优化都行。例如编译器分析某个锁只会单线程访问就消除锁,某个 volatile 变量只会单线程访问就把它当作普通变量。 JMM 规定所有变量都存储在主内存,每条线程有自己的工作内存,工作内存中保存被该线程使用的变量的主内存副原创 2021-03-10 20:15:34 · 563 阅读 · 3 评论 -
1、Java中volatile有什么作用?
小景哥哥博客 Java中volatile有什么作用? volatile是一个类型修饰符,它是被设计用来修饰被不同线程访问和修改的变量。被volatile类型定义的变量,系统每次用到它时都是直接从对应的内存中提取,而不会利用缓存。在使用了volatile修饰成员变量后,所有线程在任何时候所看到变量的值都是相同的。需要注意的是,由于volatile不能保证操作的原子性,一般情况下volatile不能代替sychronized。使用volatile会阻止编译器对代码的优化,因此会降低程序的执行效率。因此,除非迫不原创 2021-03-10 20:12:38 · 921 阅读 · 0 评论 -
多线程同步的实现方法有哪些?
个人博客:小景哥哥 Java主要提供了3种实现同步机制: ①synchronized关键字 在Java语言中,每个对象都有一个对象锁与之相关联,该锁表明对象在任何时候只允许被一个线程所拥有,当一个线程调用对象的一段synchronized代码时,需要先获取这个锁,然后去执行相应的代码,执行结束后,释放锁。synchronized关键字有两种用法,synchronized方法和synchro...原创 2018-12-14 10:39:59 · 862 阅读 · 0 评论 -
2、run()方法和start()方法的区别
个人博客:小景哥哥 run()方法和start()方法的区别 系统调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态,而非运行状态,也就意味着这个线程可以被JVM来调度执行。在调度过程中,JVM通过调用线程类的run()方法来完成实际的操作,当run()方法结束后,此线程就会终止。 如果直接调用线程类的run()方法,这会被当做一个普通的函数调用,程序中仍然只有主线程这一个线...原创 2018-11-23 14:37:03 · 3671 阅读 · 0 评论 -
3、sleep()方法与wait()方法有什么区别?
个人博客:小景哥哥 sleep()方法与wait()方法有什么区别? sleep()是使线程暂停执行一段时间的方法。wait()也是一种使线程暂停执行的方法。二者区别为: ①原理不同。 sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动苏醒。而wait()方法是Object类的方法,...原创 2018-11-23 14:35:17 · 6366 阅读 · 0 评论 -
sleep()方法和yield()方法的区别
个人博客:小景哥哥 sleep()方法和yield()方法的区别 ①sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会,而yield()方法只会给相同优先级或更高优先级的线程以运行的机会。 ②线程执行sleep()方法后会转入阻塞状态,所以执行sleep()方法的线程在指定的时间内肯定不会被执行,而yield()方法只是使当前线程重新回到可执行状态,所以执...原创 2018-11-23 14:32:53 · 1196 阅读 · 0 评论