JUC面试题volatile关键字的作用?一个共享变量(类的成员变量、类的静态成员变量)在被 volatile关键字 修饰之后,那么就具备了两层语义:
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
禁止进行指令重排序
volatile和synchronized的区别
volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
volatile 仅能使用在变量级别synchronized则可以使用在变量、方法、和类级别的
volatile仅能实现变量的修改可见性,并不能保证原子性synchronized则可以保证变量的修改可见性和原子性
volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞
volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化
后端开发
未读Java 多线程什么是并发和并行
并发:同一时刻多个指令在单个 CPU 上交替执行
并行:同一时刻多个指令在多个 CPU 上同时执行
线程实现方式Thread 实现通过将类继承 Thread 类,并重写 Run 方法
优点:实现简单,可以直接使用Thread 类中的方法
缺点:可扩展性差,不能继承其他的类
123456789101112131415161718class ExtendThread extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(getName() + " : " + "ExtendThread-Thread"); } super.run(); }}private static void runExtendThread() { ...
Scala Actor 并发编程模型 Actor并发编程模型,是 Scala 提供的一直与 Java 完全不一样的并发编程模型,是一直基于事件模型的并发机制。Actor并发编程模型是一种不共享数据,依赖消息传递的并发编程模型,有效避免了资源争夺、死锁等现象。
Actor是一种基于事件(消息)的并发编程模型,不共享数据,有效避免了共享数据加锁问题。
Java并发编程对比 Actor 并发编程模型
Java并发编程
Actor 并发编程模型
共享数据锁模型(share data and lock)
share nothing
每个 object 都有一个monitor,用来监视对共享数据的访问
不共享数据,Actor直接通过Message通讯
加锁代码使用synchronized标识
死锁问题
每个Actor内部是顺序执行的
每个线程内部是顺序执行的
每个Actor内部是顺序执行的
Scala 在 2.11 及之后的版本中加入了Akka并发编程框架,Actor并发编程模型已经被废弃了。
创建 Actor可以通过类(Class)或者单例对象(O ...
Java 多线程-认真学习版线程相关概念进程
进程指定的运行中的程序,操作系统会为进程分配内存空间
进程是程序的一次执行过程,或者说是一个正在运行的程序。这个进程有它自己的生命周期,产生、存在、销毁的过程
在这里IDEA程序就是一个进程
线程
线程是由进程创建的,是进程的一个实体
一个进程可以拥有多个线程
我们可以看到在IDEA整个进程中有 142 个线程
线程的一些补充概念
单线程: 在一个时刻,只允许执行一个线程
多线程: 同一时刻可以执行多个线程,这里如上图所示,IDEA就是一个多线程应用
并发: 同一时刻,多个任务交替执行,单核 CPU 实现的多任务处理就是并发
并行: 同一时刻,多个任务同时执行。多核 CPU 才能实现并行。
12345678public class CpuNum { public static void main(String[] args) { // 获取挡圈端脑 CPU 数量 Runtime runtime = Runtime.getRuntime(); int cpuNu ...