Java多线程(散)
文章平均质量分 70
Java多线程(散)
翠花也老了
专注于系统开发,执着于代码优雅
展开
-
Java创建线程的三种方式
Java中的线程创建有三种方式原创 2023-02-19 22:58:46 · 164 阅读 · 0 评论 -
为什么启动一个线程不用run()方法,而是用start()方法
Thread的 start 方法会调用一个native的start0() 方法,start0会调用操作系统底层的指令去创建一个线程,并且启动线程。操作系统会调用JVM的run,最终调回Java Thread的run方法。原创 2023-02-20 21:58:05 · 4541 阅读 · 0 评论 -
Java线程的6 种状态
当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。调用线程的start()方法,此线程进入就绪状态。锁池里的线程拿到对象锁后,进入就绪状态。原创 2023-02-20 22:42:58 · 747 阅读 · 0 评论 -
ReentrantLock 实现原理
ReentrantLock 中定义了一个Sync的同步类,它有两个实现,一个是FairSync(公平同步),一个是NonfairSync(非公平同步),两者分别代表 ReentrantLock 中锁竞争的公平和非公平特性。此后,其他线程再调用tryAcquire()方法时就会失败,直到t1线程调用unlock()方法且 state=0之后,其他线程才有机会获得锁。如果线程t1调用lock()方法,则实际上会调用tryAcquire()方法将 state通过CAS修改为1。原创 2023-03-06 23:55:07 · 112 阅读 · 0 评论 -
什么是线程死锁?如何解决死锁问题
死锁,一组互相竞争的资源的线程之间相互等待,导致永久阻塞的现象。它是如何产生的?又该如何避免呢?原创 2023-02-26 21:19:03 · 962 阅读 · 0 评论 -
如何保证线程的原子性
线程的原子性是指:一个或者一系列指令,它的操作是不可中断的,一旦开始是不允许被其他CPU或线程来中断。原创 2023-02-22 21:48:48 · 1007 阅读 · 0 评论 -
java.util.concurrent 包中的三把锁(ReentrantLock、ReentrantReadWriteLock、StampedLock)
如果某个线程已经获得了锁资源,该线程后续再去抢占相同的锁时,不需要再加锁,只需要记录重入次数。上述代码中,ReentrantLockDemo 有一个add()方法,对 非原子性的 num++ 操作加了锁,能够保证 num++ 的线程安全。其实我们想做的是:允许多个线程同时调用查询方法,但是如果有一个线程在调用写入方法,那么这时其他线程不论是调用查询还是写入方法,都要阻塞。为了解决这个问题,引入来StampedLock,它优化了读锁,写锁的访问,其实它是提供了一种乐观锁策略。原创 2023-03-04 23:45:00 · 588 阅读 · 0 评论 -
thread.join 是干什么的?原理是什么?
加了join,表示join的线程的修改对于join之外的代码是可见的。原创 2023-02-28 14:01:31 · 543 阅读 · 0 评论 -
Java多线程中的CAS
CASCompareAndSwap,或者 CompareAndSet,是一个能够比较和替换的方法。这个方法能够在多线程环境下保证对一个共享变量进行修改时的原子性不变。通常,CAS方法会传递三个参数,● 第一个参数V表示要更新的变量;● 第二个参数E表示期望值;● 第三个参数U表示更新后的值。更新的方式是:如果V==E ,表示预期值和实际值相等,则将 V修改成U 并返回 true,否则修改失败返回false。开始V==E?更新变量V并设置值为U返回true。原创 2023-03-05 23:33:57 · 683 阅读 · 0 评论 -
如何终止一个线程
使用thread.stop停止线程会导致它解锁它锁定的所有监视器,这种方法本质上是不安全的。原创 2023-02-21 23:59:54 · 1915 阅读 · 0 评论 -
深入了解Java线程锁(一)
我们多个线程访问一个资源时,我们判断是谁抢占来锁,一定要做出标记,来记录锁的持有者。原创 2023-02-24 00:15:02 · 172 阅读 · 0 评论 -
如何将类变量在不同线程间进行隔离?
ThreadLocal中的每一个线程,都会存在一个ThreadLocalMap的对象,这个对象是个集合,这个集合里面存储的是key-value形式的数据,key代表的是我们定义的ThreadLocal 对象,value代表的是我要存储在当前线程里的数据。main方法中,我们定义了一个线程数组,每个线程都获取number的值并且+10后打印。② 线程的拿到的值也是相互干扰后的,是被其他线程修改过的;可以看到,每个线程获得的值都是0,设置后都为10。这里返回的值,是每个线程独有的。原创 2023-03-01 23:35:34 · 204 阅读 · 0 评论 -
Volatile 解决线程可见性的问题
Synchronized的释放,会将工作内存中的操作同步到主内存。这是因为在hotspot的server端虚拟机中,做了深度优化(client版本就没有这个问题)。加了一个Synchronized的锁,会发现线程开启执行后,会停下来。说明while循环仍在执行,那么stop的值仍为false,说明。而IO操作会涉及到与内存、硬盘的交互,它会阻塞线程。就会发现 while中的stop生效了,线程会停下来。volatile可以禁止JIT的优化过程。执行后,没有任何输出。加了IO操作,也会使线程停下来。原创 2023-03-02 07:27:14 · 291 阅读 · 1 评论 -
偏向锁、轻量级锁、自旋锁、重量级锁,它们都是什么?有什么关联
加锁会带来性能开销,Java 1.6之前只有重量级锁。上图讲述了两个线程ThreadA和ThreadB两个线程在争抢锁,ThreadA进入来临界区,可以执行资源代码;ThreadB没有抢到锁,进入BLOCKED队列,等待唤醒。当ThreadA执行完后,释放锁,去唤醒ThreadB。这是重量级锁的流程。因为它会带来阻塞和唤醒,会带来开销,所以叫“重量级”锁。Java 1.6 之后做了优化,出现了“轻量级锁 和 偏向锁”,能够减少重量级锁的获得和释放的性能开销。原创 2023-02-25 03:41:22 · 836 阅读 · 0 评论 -
线程的通信 ( wait / notify)
下面我们使用生产者/消费者的典型场景,来描述 wait/notify 的通信过程。wait / notify 本质上是线程的通信。原创 2023-02-25 23:56:29 · 99 阅读 · 0 评论