![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 50
念兰
这个作者很懒,什么都没留下…
展开
-
Thread 类的 sleep()方法和对象的 wait()方法的区别
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第 66 题中的线 程状态转换图)。wait()是 Object 类的方法,调用对象的 wait()方法导致当前线 程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用 对象的 notify()方法(或 notifyAll()方法)时才能唤醒等待池中的线程进入等锁池原创 2021-11-27 16:14:26 · 402 阅读 · 0 评论 -
ThreadLocal线程变量
ThreadLocal的线程隔离:每个人都有一份属于自己的操作变量,线程和线程之间是隔开的 应用场景:比如在登陆时将user放在ThreadLocal中,要使用时再从里面拿 ThreadLocal内存泄漏问题 1·tl引用指向threadLocal 2·有一个thread的成员变量map指向key是threadLocal,value是存放值的map空间 3map的key是弱引用(如果key不是弱引用,在我们不想用threadLocal的时候,tl就会=null,这让会被jvm回收,但是哪怕我把t原创 2021-11-18 10:46:40 · 2763 阅读 · 0 评论 -
Synchronized锁
实现原理 加在同步代码块上是通过monitorenter和monitorexit指令获取线程的执行权 (同步代码块是利用monitorenter和monitorexit这两个字节码指令,他们分别位于同步代码块的开始和结束位置。当JVM执行到monitorenter时当前线程试图获取monitor对象的所有权,如果没加锁或者已经被当前线程持有,就把锁的计数器+1,当执行monitorexit时,锁的计数器-1,当锁的计数器为0就会释放锁,如果获取monitor对象失败,此锁就会进入线程阻塞状态,直到其他.原创 2021-11-16 15:45:28 · 81 阅读 · 0 评论 -
单例DCL(Double Check Lock)需要加volatile关键字吗
首先DCL是双重检查锁,懒汉式的一种实现方式 DCL方式可以实现单例,但可能发生线程获取到的对象未被初始化的场景 对象初始化过程 当使用new关键字创建一个对象时 JVM会为对象优先分配栈内存 内存分配完后设置默认属性值 执行构造函数,属性设置初始值 建立连接,引用指向对象内存地址 如果在对象未初始化的时候就先建立连接,使用DCL实现的单例模式就会导致线程拿到未被初始化的对象,未被初始化的对象属性为引用类型则值全部为null,一旦对这些属性进行操作则会抛出空指针异常 volatile原创 2021-11-16 15:02:48 · 215 阅读 · 0 评论 -
AQS中公平锁与非公平锁的对比
公平锁 多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁 优点:所有的线程都能得到资源,不会饿死在队列里 缺点:吞吐量的下降,队列里除了第一个线程其他的线程都会阻塞,cpu环形阻塞线程的开销上升 非公平锁 多个线程去获取锁的时候会直接尝试获取,就获取不到再进入阻塞队列,如果能获取就就直接获取到锁了 优点:减少cpu唤醒线程的开销,整体吞吐效率提高,cpu不用唤醒所有线程,会减少唤起线程的数量 缺点:可能会导致队列中的一些线程一直或长时间获取不到锁导.原创 2021-11-16 00:42:08 · 252 阅读 · 0 评论 -
多线程原子性
原子性是指在一次操作或多次操作中,要么所有的操作全部都得到了执行并不会受到任何因素的干扰而中断,要么所有的操作都不执行,多个操作是一个不可分割的整体 volatile关键字 因为堆内存是唯一的而每一个线程都有自己的线程栈 每一个线程栈在使用堆内存里面的变量时都会拷贝到变量的副本中 在线程中每一次使用是从变量副本中获取的 volatile关键字是强制线程每次使用时都会看一下共享区的最新值 synchronized synchronized锁解决流程 1线程获得锁 2清空变量副本 3拷原创 2021-10-28 08:01:30 · 330 阅读 · 0 评论 -
Java多线程进阶
线程状态 线程被创建并启动以后不是立刻就进入执行状态也不是一直处于执行状态 线程状态 线程状态 含义 NEW 一个尚未启动的线程的状态。也称之为初始状态、开始状态。线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread()只有线程象,没有线程特征。 RUNNABLE 当我们调用线程对象的start方法,那么此时线程对象进入了RUNNABLE状态。那么此时才是真正的在JVM进程中创建了一个线程,线程...原创 2021-10-28 08:01:03 · 86 阅读 · 0 评论 -
Java多线程
多线程是指从软件或硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程从而提升性能 并发和并行 并行:同一时刻多个CPU同时执行多个指令 并发:同一时刻单个CPU同时执行多个指令 进程和线程 进程:正在运行的程序 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位 动态性:进程的实质是程序的一次执行过程,进程是动态产生和动态消亡的 线程:是进程中的单个顺序控制流,一条执行路径 单线程:一个进程只有一条执行路径就称为原创 2021-10-28 08:00:48 · 140 阅读 · 0 评论 -
Java锁机制
偏向锁/轻量级锁/重量级锁 偏向锁性能最好,可以避免执行CAS操作. 轻量级锁用自旋和CAS避免了重量级锁带来的线程阻塞和唤醒,性能中等 重量级锁则会把获取不到的锁的线程阻塞,性能最差 (这三种锁特指synchronized锁的状态,通过在对象头中的mark word来表明锁的状态) 偏向锁 如果至始至终对这把锁都不存在竞争,那就没必要上锁,只需打个标记,这是偏向锁的思想.一个对象被初始化后,还没有任何线程来获取他的锁时,那他就是偏向的,当第一个线程来访问他并尝试获取锁的时候,他就将这个线程记原创 2021-11-13 14:25:29 · 50 阅读 · 0 评论