
JAVA线程
Susceptible0506
这个作者很懒,什么都没留下…
展开
-
CAS
乐观锁与悲观锁 Synchronized这种独占锁,属于悲观锁。 悲观锁始终假定会发生并发冲突,因此会屏蔽一切可能会违反数据完整性的操作。 乐观锁假设不会发生并发冲突,因此只在提交操作时检查是否违反数据完整性,如果提交失败,则会进行重试。乐观锁最常见的就是CAS了。 CAS(Compare and Swap) 是一种高效实现线程安全性的方法 支持原子更新操作,适用于计数器,序列发生器等场景 属于乐观锁机制,号称lock-free CAS操作失败时有开发者决定是继续尝试,还是执行别的操作.原创 2020-09-28 19:56:05 · 241 阅读 · 0 评论 -
volatile
volatile是JVM提供的轻量级同步机制 保证被volatile修饰的共享变量对所有线程总是可见的。当一个线程修改了一个被volatile修饰的共享变量时,其他线程能够立即感知到变动 禁止指令重排序优化。 使用volatile修饰的变量仍然会存在线程安全的问题 如下程序所示,两个线程可能在同一时间读取value值为同一值,对value值进行加1的操作,就会导致线程安全的问题。 要解决线程安全的问题,就要在increase方法前加上synchronized关键字。由于synchro..原创 2020-09-28 19:54:55 · 341 阅读 · 0 评论 -
synchronized底层实现原理
实现synchronized的基础是java对象头和Monitor Java对象头 对象在内存中的布局分为三个部分:对象头、实例数据、对齐填充 一般来说,synchronized使用的锁对象是存储在Java对象头中 对象头结构: 对象头是与对象自身定义的数据没有关系的额外存储成本,考虑到JVM的空间效率,Mark Word被设计成非固定的数据结构,以便存储更多有效的数据。它会根据对象本身的状态复用自己的存储空间。 Monitor 每个Java对象天生自带了一把看不见的...原创 2020-09-28 19:51:49 · 374 阅读 · 0 评论 -
JAVA线程5 线程操作中的常用函数及区别
Sleep和Wait的区别 wait必须写在synchronized的原因在于,当前线程需要获取到锁才可以释放锁 当执行sleep()方法的时候,线程不会让出锁,等到sleep时间结束后,线程继续执行 但是,执行wait()方法后,线程将锁让出,进入等待队列,别的线程这时候会获取锁,执行 notify和notifyAll的区别 如果wait没有设置等待时间,程序就会进入无限的等待状态,这时候就需要别的线程去唤醒它 调用notifyAll或者notify方法可以达到效果 .原创 2020-06-05 19:47:56 · 252 阅读 · 0 评论 -
JAVA线程4 多线程同步
同步与异步? 同步:在多线程中经常会碰到数据的共享问题,即当多个线程访问同一个资源时,需要以某种顺序来确保该资源在某一时刻只能被一个线程使用。 要想实现同步操作,必须要获得每一个线程对象的锁。保证在同一时刻只有一个线程能够进入临界区(访问互斥资源的代码块),并且在这个锁被释放之前,其他线程就不能进入该临界区。 异步和非堵塞类似,由于每个线程都包含了运行时自身所需要的数据或方法,因此在进行输入输出时,不必关心其他线程的状态或行为。 多线程同步的方式有哪些? 1.使用synchronized关键.原创 2020-06-05 19:34:59 · 190 阅读 · 0 评论 -
JAVA线程3 如何实现处理线程的返回值
在线程执行过程中可能会存在一个问题,如下所示:在线程中我们更新了线程对象value的值,因为线程是异步执行的,还未等到线程执行完毕,main函数就输出了value值,此时value的值为null。那么我们如何才能让main函数能够在线程完成后再输出更新后的value值呢?? 方式1:主线程等待法 方式2:使用Thread类的join()阻塞当前线程以等待子线程处理完毕 join方法 作用:让调用该方法的线程在执行完run()方法后,再执行join方法后面的代码。将两个线程合并,用于实现同步功原创 2020-06-05 19:24:05 · 356 阅读 · 0 评论 -
JAVA线程2 线程的创建
1 如何实现Java多线程? 1.1.继承Thread类,重写run()方法 Thread类本质上是实现了Runnable接口的一个实例。 Class MyThread extends Thread{ public void run() { System.out.println(“Thread body”); } } public class Test{ public static void main(String[] args){ ...原创 2020-06-05 16:31:51 · 163 阅读 · 1 评论 -
JAVA线程1 线程基础及线程状态
线程与进程? 线程是指程序在执行过程中,能够执行程序代码的一个执行单元。 线程的状态4种:运行、就绪、挂起、结束。 进程是指一段正在执行的程序。 一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段、堆空间)、进程级资源(比如文件),但是各个线程拥有自己的栈空间。 使用多线程的好处? 使用多线程可以减少程序的响应时间。 与进程相比,线程的创建和切换开销更小。 多CPU或多核计算机本身就具有执行多线程的能力。 使用多线程能简化程序的结构,使程序便于理解和维护。一个复.原创 2020-06-05 16:19:34 · 202 阅读 · 0 评论