
JAVA多线程
文章平均质量分 85
lianwenhong
一个程序员
展开
-
java锁机制 偏向锁-轻量级锁-重量级锁
首先粗略了解一下java对象的内存结构:紧接着看下Mark Word的内存结构(以下都用缩写MW代表Mark Word):再看下当一个对象被当成锁对象之后的内存结构变化:当对象处于无锁状态时没什么好说的,它并没有多线程的情况。当对象处于多线程环境下,我们往往是通过给对象加锁的做法来保证多线程操作共享变量的安全性,此时为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。本文主要了解一个对象在多线程环境下的锁膨胀机制,大概就是无锁->偏向锁->轻量锁->重原创 2022-01-11 10:44:59 · 846 阅读 · 1 评论 -
Java锁机制之synchronized
java中2种锁的实现原理区别:synchronized: 在软件层面依赖JVM,在jvm将class文件编译成字节码文件时添加monitorenter和monitorexit句柄来区分加锁代码块Lock: 在硬件层面依赖特殊的CPU指令。synchronized机制:首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个非空对象都可以作为一个锁。synchronized关键字锁具体表现为:锁对象和锁对象的class类;每个类可以有很多实例对象,不同实例对象的对象锁互不干扰,但原创 2022-01-08 22:26:05 · 3564 阅读 · 1 评论 -
ThreadLocal使用及原理解析
ThreadLocal作用和原理我们知道Java多线程会出现安全问题主要原因是因为多线程同时访问一个共享数据,从而我们解决多线程问题的思路主要有2个:1.给共享数据加锁2.避免多线程操作同一共享数据而思路1是我们平时比较常用的一种方式,但是既然是加锁就必然会有一些性能方面的问题,比如线程等待。所以今天我们讲讲思路2,但是思路2并不能适用于所有线程安全问题,因为在很多具体业务场景下必须让多线程访问同一数据,所以思路2适用于可以将共享数据变为线程私有变量的场景,例如Android中Handler的实现原创 2021-09-12 23:03:45 · 776 阅读 · 0 评论 -
Java Thread中的join()方法解释
Join作用join是定义在Thread类中的方法,作用是阻塞当前线程的执行,等到被调用join的线程对象执行完毕才执行继续执行当前线程。在Java源码中的定义如下:public final void join() throws InterruptedException { join(0);}public final synchronized void join(long millis) throws InterruptedException接下来我们先来看看join的简单使用,这样能原创 2021-08-28 00:00:22 · 8475 阅读 · 1 评论 -
Java yield方法解释
Thread.yield()用法及解释我们知道在jvm中的并发并非真正的并发,而是cpu将执行过程划分为了时间片,在程序执行过程中,cpu会根据自身的规则分别去调度各个线程。只是这个时间片很短所以给我们的感觉像是并发。某一个线程得到执行也就是这个线程获取到了cpu的执行权。这里再补充一个刚想到的知识点,与yield无关:每个线程内部都有一个程序计数器大体的作用是用于标记当前执行到的代码行数等信息,当某个线程执行过程中cpu执行权被释放的时候,该线程当前执行的相关数据会被存在程序计数器中,等下次该线程重新原创 2021-08-27 23:59:42 · 6054 阅读 · 0 评论 -
Java Thread中的interrupt()方法的解释
结束线程的思考早前java中线程的结束有2种:1.线程的run()方法执行完毕时,该线程会结束。2.是线程调用stop方法结束。后来java认为在线程中去强制结束其他线程是不安全的,因为被结束的线程可能会有某些必要的操作还来不及执行。当然这个解释只是从网上抄过来的,api中说明的Deprecated原因是说stop将导致它解锁所有已锁定的监视器(这是未检查的ThreadDeath异常向上传播堆栈的自然结果),其实每个对象包含了对象头,实例数据和填充数据,对象头中保存了锁的标志位和指向monito原创 2021-08-27 23:59:06 · 2167 阅读 · 0 评论 -
Java wait和notify方法解释
wait与notify的API以及解释public final void wait() throws InterruptedException { wait(0);}public final void wait(long timeout, int nanos) throws InterruptedException {}public final native void wait(long timeout) throws InterruptedException;public fina原创 2021-08-27 23:58:32 · 519 阅读 · 0 评论 -
Java volatile关键字
关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、完整的理解。很多人遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步,这样在某些场景下其实很影响性能。所以了解volatile其实很有必要。当一个变量被定义为volatile之后,它将具备两种特性:1.保证此变量对所有线程的可见性。这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的,而普通变量就做不到这一点。2.在对此变量的读写操作上是禁止指令原创 2021-08-27 23:56:32 · 131 阅读 · 0 评论