JAVA多线程
文章平均质量分 70
白色的榆
这个作者很懒,什么都没留下…
展开
-
并发编程笔记8--ThreadLocal结构详解
ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。可以通过set(T)方法来设置一个值,在当前线程下在通过get()方法获取到原先设置的值。在set方法中,首先获取当前线程,然后获取当前线程关联的ThreadLocalMap,而ThreadLocalMap是ThreadLocal类中定义的一个结构。首先来看下set方法,基于JDK8。原创 2024-05-25 21:38:51 · 511 阅读 · 0 评论 -
并发编程笔记7--并发编程基础
现代操作系统中运行一个程序,会为他创建一个进程。而每一个进程中又可以创建许多个线程。现代操作系统中线程是最小的调度单元。。一个Java程序从main方法开始执行,然后按照既定的顺序执行代码,看上去没有其他线程参与。但实际上Java程序天生就是多线程程序。我们可以通过JMX来查看一个普通的Java程序包括哪些线程。上面代码执行结果如下:从上图可以看到,一个Java程序运行不仅是main方法的运行,而是main进程和一些其他进程的同时运行。原创 2024-05-25 21:38:11 · 555 阅读 · 0 评论 -
并发编程笔记6--双重检查锁与延迟初始化
通过对比基于volatile的双重检查锁定方案和基于类初始化的方案,我们发现类初始化方案的实现代码更加简洁。但基于volatile的双重检查锁定方案有一个额外的优势:除了可以对静态字段实现延迟初始化外,还可以对实例实现字段实现延迟加载。原创 2024-05-18 13:48:24 · 1159 阅读 · 0 评论 -
并发编程笔记5--Java内存模型
JMM通过happens-before关系向程序员提供跨线程间的内存可见性保证。如果A线程的写操作a和B线程的读操作B存在happens-before关系,那么无论a操作和b操作在不在一个线程里,JMM都保证a操作对b操作是可见的。如果一个操作happens-before另一个操作,那么第一个操作的执行结果对第二个操作是可见的,切第一个操作的执行顺序在第二个操作前面。如果两个操作存在happens-before关系,并不意味着java平台就按照happens-before关系指定的关系来进行。原创 2024-05-18 13:47:24 · 754 阅读 · 0 评论 -
并发编程笔记3--synchronize底层实现原理
Java中每一个对象都可以作为锁,具体的表现为以下3中方式当一个线程试图访问同步代码块时,他必须先获得锁。退出或抛出异常必须释放锁。那么锁到底存在哪里呢?锁中存储的是什么信息呢?从JVM规范中可以看到Synchronize在JVM中的实现原理,JVM是基于进入或退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。1、代码块同步是使用monitorenter和monitorexit指令实现,2、而方法同步是使用另一种方式实现的,细节在JVM规范中并未详细说明。原创 2024-05-17 18:09:12 · 860 阅读 · 0 评论 -
并发编程笔记4--原子操作的实现原理
32位IA-32处理器使用基于对缓存加锁或者总线加锁的方式来实现多处理器之间的原子操作。处理器保证从系统内存内读取或写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的地址。原创 2024-05-17 18:07:52 · 923 阅读 · 0 评论 -
并发编程笔记2--volatile底层实现原理
定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性更新,线程应该通过排它锁确保单独获得这个变量。volatile在某些情况下比锁更加方便,如果一个字段被声明成volatile,Java线程模型确保所有线程看到的这个变量都是一致的。当一个线程修改这个变量时,其他线程能读到这个修改后的值。原创 2024-05-16 13:18:38 · 349 阅读 · 0 评论 -
并发编程笔记1--上下文切换
我们知道在单核处理器中也支持多线程,CPU通过为每个线程分配CPU时间片来实现“看上去”的并发。由于每个CPU时间片时间很短,CPU通过快速的切换CPU时间片,来实现我们看上去的多线程的并发执行。但是从CPU的角度来看实际上还是串行执行。因为每个时间片很短,CPU切换时间片之后还要切换到原来的线程上继续执行,其就要保存原来线程的状态,在其切换到原来的线程之后可以在加载到这个任务的状态(继续接着上次的执行)。总结:任务从保存到在加载的过程算是一次上下文切换。原创 2024-05-16 13:16:44 · 492 阅读 · 0 评论 -
并发编程知识图
然后,既然并发很重要,而并发处理的是任务,接下就是:对任务的抽象、拆解、分工执行。而线程模型,只是其中的一种模型,还有多进程、协程。Java使用的是多线程模型,对应到具体的代码就是:Thread, Runnable, Task,执行任务有:Exectors。引出了线程,有势必存在着线程安全性的问题,因为多线程访问,数据存在着不一致的问题。首先,得理解并发的重要性,为什么需要并发?对于这个问题,只需要放在潜意识里面,只需要两个字:性能!其它的细节,再去慢慢拓展。原创 2024-05-15 22:12:21 · 295 阅读 · 0 评论 -
Java多线程是怎么实现的
Java多线程实现方式主要有4种:继承Thread类,实现Runnable接口,实现Callbale接口通过FutureTask包装器来创建Thread线程,使用EcecutorService,callable, Future实现有返回值的多线程其中前两种执行后额没有返回值,后两种是带返回值的。1.继承Thread类 Thread类本质上是实现Runnable接口的一个实...转载 2018-08-17 18:14:26 · 640 阅读 · 0 评论