Java多线程
文章平均质量分 91
进行Java多线程开发和并发编程的问题总结
Tony-devj
Java方向的开发
展开
-
Java多线程编程- StampedLock (JDK8新增)
Java多线程编程- StampedLockWriting模式Reading模式Optimistic Reading模式StampedLock一种基于功能的锁,具有三种模式来控制读写访问。 StampedLock的状态由版本和模式组成。锁获取方法返回一个表示并控制相对于锁状态的访问的stamp;这些方法的“try”版本可能会返回特殊值零,以表示无法获取访问权限。锁释放和转换方法需要使用stamp作为参数,如果它们与锁的状态不匹配,则会失败Writing模式方法writeLock可能会阻止等待独占访问,原创 2021-04-19 21:00:00 · 137 阅读 · 0 评论 -
Java多线程编程-AbstractQueuedSynchronizer(AQS)同步队列
Java多线程编程-AbstractQueuedSynchronizer同步队列AbstractQueuedSynchronizerAbstractQueuedSynchronizer.NodeAbstractQueuedSynchronizer我们在进行ReentrantLock和ReentrantReadWriteLock使用的时候,我们查看源码的时候,是使用Sync抽象类进行处理,Sync是继承了AbstractQueuedSynchronizer进行相应的操作,源码如下://此锁的同步控制基础原创 2021-04-16 11:47:51 · 256 阅读 · 0 评论 -
Java多线程编程-LockSupport工具类使用及源码分析
Java多线程编程-LockSupport工具类使用及源码分析LockSupport类LockSupport.park()1.调用unpack方法获得许可2.调用中断interrupts方法获得许可parkNanos(long nanos)park(Object blocker)parkNanos(Object blocker, long nanos)parkUntil(Object blocker, long deadline)在Java工具包中有一个LockSupport工具类,主要负责挂起和唤醒线程原创 2021-04-13 16:53:35 · 534 阅读 · 0 评论 -
Java多线程编程-ReentrantReadWriteLock 读写锁使用
Java多线程编程-ReentrantReadWriteLock 读写锁使用ReentrantReadWriteLock读锁与读锁不互斥ReentrantReadWriteLock读锁与写锁互斥ReentrantReadWriteLock写锁与写锁互斥ReentrantReadWriteLock写锁与读锁互斥ReentrantLock具有完全互斥的效果,每次只能有一个线程在执行lock方法后的任务。这样可以保证实例变量的线程安全性,但是效果不是很理想。假如我们多有线程都是读操作,没有写操作的时候就不需要其原创 2021-04-08 17:22:34 · 226 阅读 · 2 评论 -
Java多线程编程-ReentrantLock(2)
Java多线程编程-ReentrantLock公平锁和非公平锁使用ReentrantLock实现公平锁公平锁ReentrantLock相关APIReentrantLock.getHoldCount()ReentrantLock.getQueueLength()ReentrantLock.getWaitQueueLength(Condition condition)ReentrantLock.isFair()ReentrantLock.hasQueuedThread(Thread thread)Reentra原创 2021-04-08 14:35:48 · 238 阅读 · 1 评论 -
Java多线程编程-ReentrantLock(1)
Java多线程编程-ReentrantLock使用及其源码解析ReentrantLock简单使用ReentrantLock实现等待通知在java多线程开发中,我们可以使用synchronized关键字来实现线程之间的同步互斥,我们也可以使用ReentrantLock实现更多的功能,如嗅探锁定。多路分支通知等功能,使用上会比synchronized更加灵活。ReentrantLock简单使用可重入的互斥Lock,具有与使用sync方法和语句访问的隐式监视器锁相同的基本行为和语义。由上一次成功锁定但尚未原创 2021-04-04 13:24:50 · 119 阅读 · 2 评论 -
Java多线程编程-ThreadLocal和InheritableThreadLocal使用及其源码分析
Java多线程编程-ThreadLocal和InheritableThreadLocal使用及其源码分析ThreadLocal使用ThreadLocal相关APIget()方法和set()方法如果我们想为每一个线程都有自己的共享变量,那我们可以使用ThreadLocal,如果我们使用public static是所有线程都可以使用。ThreadLocal使用提供线程局部变量。这些变量与普通变量不同,因为每次访问一个线程(通过其get或set方法)的线程都有其自己的,独立初始化的变量副本。ThreadLo原创 2021-03-30 17:32:42 · 89 阅读 · 0 评论 -
Java多线程编程-Thread API(join)
Java多线程编程-Thread APIThread.join()方法当我们想让主线程等待相应的子线程全部运行完在运行完怎么解决这个问题呢? 我们可以使用Thread.join()方法Thread.join()方法等待当前线程死亡源码:public final void join() throws InterruptedException { join(0); }还有一个带参数join方法,等会试试 public final synchronized void joi原创 2021-03-29 20:54:20 · 119 阅读 · 0 评论 -
Java多线程编程-Object wait和notify|All
Java多线程编程-Object wait和notifyObject.wait()方法调用wait方法的时候,当前线程必须拥有这个对象monitorObject.notify()方法Object.notifyAll()方法Java多线程环境下,线程与线程之间是可以进行通信的,是可以进行相互交互的。现在我们先从Object对象中的wait方法和notify方法进行说起吧。Object.wait()方法导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法,或者指定的原创 2021-03-26 14:07:42 · 158 阅读 · 1 评论 -
Java多线程编程-Thread synchronized使用(二)
Java多线程编程-Thread synchronized使用synchronized同步代码块synchronized(this)同步的对象synchronized 作用不在对象上synchronized 实例对象synchronized 作用在静态方法上线程死锁问题前面我们是在方法上面进行同步的,这样有一些问题:如果一个线程调用一个同步方法时间比较长,那么另外一个现场就需要等待比较长的时间我们可以进行验证:线程引用的对象:public class ThreadObject { pub原创 2021-03-24 11:17:22 · 144 阅读 · 1 评论 -
Java多线程编程-Thread synchronized使用(一)
Java多线程编程-Thread synchronized使用线程安全的变量(方法内的变量)我们在进行多线程开发的时候,会出现线程安全问题。非线程安全就是数据出现不一致导致的,对同一个对象中的实例变量进行并发访问时发生。就是取到的数据是被修改过的。线程主要通过共享对字段和对象引用字段所引用的访问来进行通信。 这种通信方式非常有效,但是却可能导致两种错误:线程干扰和内存一致性错误。 防止这些错误所需的工具是同步。但是,同步会引入线程争用,当两个或多个线程尝试同时访问同一资源并使Java运行时更慢地执行一原创 2021-03-22 19:29:03 · 171 阅读 · 1 评论 -
Java多线程编程-Thread API (三)
Java多线程编程-Thread APIThread.yield()方法守护进程Thread.setDaemon()方法Thread.setPriority()我们都知道在执行多线程的时候,我们调用start方法的时候,线程不会立即执行,因为需要获得CPU的执行权之后才能运行线程。但是我们也可以让执行的线程放弃CPU的执行权。Thread.yield()方法yield():给调度程序的提示是当前线程愿意放弃当前使用的处理器。调度程序可以随意忽略此提示Yield是一种启发式尝试,旨在提高线程之间的相对原创 2021-03-19 15:08:32 · 77 阅读 · 0 评论 -
Java多线程编程-Thread API (二)
Java多线程编程-Thread APIThread.interrupt()方法Thread.interrupted()方法Thread.isInterrupted()方法发生异常中断线程在线程sleep的时候调用interrupt()方法使用return停止线程上面我们看了Thread类中的currentThread()方法,sleep()方法,getId()方法,isAlive()方法,现在我看看其他的一些APIThread.interrupt()方法interrupt():中断该线程,除非始终允原创 2021-03-18 17:39:39 · 78 阅读 · 3 评论 -
Java多线程编程-Thread API (一)
Java多线程编程-Thread API Thread.currentThread()Thread.isAlive()方法Thread.sleep()方法Thread.getId()方法总结Thread是Java实现多线程的关键类,Thread提供了先关的API,我们来说说相关的API,就从我们使用最多的开始说起。Thread.currentThread()currentThread():返回对当前正在执行的线程对象的引用源码://调用native的方法public static native原创 2021-03-17 15:26:11 · 81 阅读 · 0 评论 -
Java多线程编程-线程实例变量
Java多线程编程-线程实例变量Java内存区域线程实例变量不共享自定义线程类中的实例变量针对其他的线程可以是共享,也可以不是共享的。Java内存区域Java虚拟机在执行Java程序的过程中会把虚拟机所管理的内存划分为若干个不同的数据区,有些数据区是线程共享的,有些数据区不是线程共享。方法区和堆是所有线程共享的Java栈、本地方法栈和程序计数器是线程私有的线程实例变量不共享...原创 2021-03-16 19:39:44 · 418 阅读 · 0 评论 -
Java多线程编程-创建线程及其源码分析
Java多线程编程-创建线程及其源码分析创建线程通过继承Thread类进行创建Thread的构造函数Thread()构造函数Thread(String name)构造函数通过实现Runnable接口进行使用在Java中,使用多线程使用Thread进行实现。在Java中创建多线程的方式有两种:1、继承Thread类 2.实现Runnable ,如果不想用类进行封装,可以使用匿名线程进行创建(这种方式不推荐使用)创建线程通过继承Thread类进行创建public class CreateThreadV1原创 2021-03-15 19:55:41 · 91 阅读 · 0 评论