我不知道有没有人遇到过,有一段时间,我都觉得那些 set,get的用处何在,我直接写一个public直接拿不就行了,多爽,但是随着使用的频繁,越来越想去搜索一下这个问题,而不是按照官方的推荐,前辈们的使用都是建议...这里引入其中的一句话: 在任何相互关系中,具有关系所涉及的各方都遵守的边界是十分重要的事情,当创建一个类库时,就建立了与客户端程序员之间的关系,他们同样也是程序员,但是他们是使用你的类库来构建应用...如果所有的类成员对任何人都是可用的,那么客户端程序员就可以对类做任何事情,而不受约束。即使你希望客户端程序员不要直接操作你的类中的某些成员,但是如果没有任何访问控制,将无法阻止此事发生。...综上所述,写到这里,我诞生了一个想法,其实set ,get ,public,对于它们使用完全取决于我们程序员自己,为了让项目之间的逻辑更加清晰,有些标准自上而下,慢慢的传了下来,无论你使用那种,但是有一个东西是无法避免的...补充说明,set字面意思设置,get获取,我们了解一下java面向对象编程的封闭性与安全性,private 修饰的set get方法将方法封闭在了一个特定类中,其他类就无法对其变量进行方法,这样就提高了数据的安全性
ReadWriteLock接口并添加了可重入的特性。...当有写线程持有写锁或者有等待的写线程时,一个尝试获取公平的读锁(非重入)的线程就会阻塞。这个线程直到等待时间最长的写锁获得锁后并释放掉锁后才能获取到读锁。 可重入 允许读锁可写锁可重入。...Sync分析 Sync中提供了很多方法,但是有两个方法是抽象的,子类必须实现。...继承AQS的类都需要使用state变量代表某种资源,ReentrantReadWriteLock中的state代表了读锁的数量和写锁的持有与否,整个结构如下: 可以看到state的高16位代表读锁的个数...实现如下: protected Thread getOwner() { return sync.getOwner(); } 可以看到直接调用了Sync的getOwner方法,下面是
在分析重入锁代码之前,我们需要先知道重入锁ReentrantLock分为公平锁和非公平锁(通过构造函数创建不同的锁),它的内部基于AQS实现抽象类Sync同步器(在AQS文章中我们谈论过)。...long serialVersionUID = -3000897897090466540L; final void lock() { //不同于非公平锁,这里直接使用...Sync以及公平锁和非公平锁代码我们已经分析过(我觉得核心还是要去分析AQS的代码,然后才能理解重入锁代码逻辑)。...new FairSync() : new NonfairSync(); } 然后是lock方法 //sync在开始已被定义,何种锁也在构造方法中确定,这里直接调用Sync实现类的lock...,这也说明了为什么nonfairTryAcquire定义在Sync中,以及他叫可重入锁 public boolean tryLock() { return sync.nonfairTryAcquire
,都支持可重入 ReentrantLock问题分析 【1】ReentrantLock公平锁和非公平锁的性能谁更高? ...TODO 业务逻辑:读写操作不能保证线程安全 } finally { // 解锁,放置在这里的原因是保证异常情况都不能干扰到解锁逻辑 lock.unlock(); } 【2】可重入的尝试...,此方法也会立即返回获取锁成功或失败,公平策略不生效 if (!...; } //为子类留下的加锁逻辑的抽象方法 abstract boolean initialTryLock(); //核心加锁逻辑里面便是使用抽象方法进行加锁...Sync类 的非公平锁 NonfairSync类部分 //与公平的同步器进行比较的话,会发现,他们本质没什么区别,因为大多数走的都是抽象方法的逻辑和AQS的方法 //最大的区别在于加锁的方式不同,公平方式
1.类结构及注释 1.1 类结构 ReentrentLock是java并发包中的一个重要的同步工具,其设计本身与synhronized的作用类似,实现了一个互斥锁。...其产生的原因是在java的早期,synchronized的效率比较低,其阻塞大量使用了系统调用中的重量级锁0x80,这样导致需要从内核态和用户态切换,从而影响系统的效率。...可以看到,ReentrentLock实现了Lock和Serializable接口,其内部有三个类,继承了抽象类AbstractQueueSynchronizer的Sync类,以及其实现公平和非公平锁的子类...1.2 类注释 ReentrentLock类前面的注释如下: ReentrantLock是一个可重入的互斥锁,其基本行为和语义与使用Synchronized方法和语句的隐式管程锁相同,但是具有更多的扩展功能...实现了前面讨论AQS中的一些模板方法。 ? 3.1 Sync Sync是一个抽象类,其定义了一个抽象方法lock,其子类需要实现这个方法。
ReentrantLock的简单使用:obj.lock()/obj.unlock()。 设计模式之模板方法:模板类是抽象方法,里面存在大量通用方法,差异方法采用抽象方法实现,给具体得子类实现。...使用volatile修饰,解决多线程的可见性问题,state在不同子类中含义不同,ReentrantLock中0表示未加锁,1表示加锁,大于1表示锁重入,state有三个方法修改,分别是get/set...,旧版本直接set,可重入在其他地方实现 // 这里获得锁就会执行lock()后面的函数 if (!...: AQS是为其他同步组件提供一个强大的基础,不希望别人直接拿来使用,也就是不希望直接new,而是继承实现,所以定义为抽象类。...,用于管理可重入的线程访问共享资源的顺序。
1 基本设计 ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。...具有与使用 synchronized 方法和语句访问的隐式监视器锁相同的基本行为和语义的可重入互斥锁,但具有扩展功能。 ReentrantLock 由最后成功锁定但尚未解锁的线程所拥有。...尝试超过此限制会导致锁定方法引发错误。 2 类架构 ReentrantLock 本身不继承 AQS,而是实现了 Lock 接口 ?...Lock 接口定义了各种加锁,释放锁的方法,比如 lock() 这种不响应中断获取锁,在ReentrantLock 中实现的 lock 方法是通过调用自定义的同步器 Sync 中的的同名抽象方法,再由两种模式的子类具体实现此抽象方法来获取锁...tryAcquire 是在子类中实现的,但是都需要对trylock 方法进行非公平的尝试。
说说 sleep() 方法和 wait() 方法区别和共同点? 为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?...线程池 为什么要用线程池? 你会使用线程池吗? 如何创建线程池比较好?(推荐使用 ThreadPoolExecutor 构造函数创建线程池) ThreadPoolExecutor 类的重要参数了解吗?...几种常见的线程池了解吗?为什么不推荐使用FixedThreadPool? 如何设置线程池的大小? …… AQS 简介 原理 AQS 常用组件。...ReentrantLock 和 ReentrantReadWriteLock …… 锁 锁的常见分类 可重入锁和非可重入锁 公平锁与非公平锁 读写锁和排它锁 synchronized 关键字 说一说自己对于...ReadWriteLock StampedLock(JDK8) CAS 介绍 原理 Atomic 原子类 介绍一下 Atomic 原子类; JUC 包中的原子类是哪 4 类?
本文内容 1.锁策略:乐观/悲观,轻量/重量,自旋/挂起等待,读写,公平/非公平,可重入/不可重入,其他锁策略,Callable 2.CAS:原理,应用(原子类,自旋锁),ABA 3.JUC(java.util.concurrent...) 的常见类:ReentrantLock,原子类,Semaphore,CountDownLatch 4.线程安全的集合类:多线程环境使用 ArrayList/队列/哈希表 1.锁策略 1.1各种锁策略介绍...重量级锁:严重依赖操作系统内核提供的互斥机制(mutex) 轻量级锁:尽量不依赖mutex,能在用户态解决就不切换内核态 当线程遇到轻量级锁时,会使用CAS指令快速获取锁,当获取成功后,该线程继续执行...1.1.6可重入锁/不可重入锁 可重入锁:线程已经持有某个对象的锁,那么它可以再次获取该对象的锁,不会被阻塞。...可重入锁通常会维护一个计数器,记录当前线程获取锁的次数。每次获取锁时,计数器加一;释放锁时,计数器减一。
大家好,又见面了,我是你们的朋友全栈君。 Qt提供QThread类以进行多任务处理。与多任务处理一样,Qt提供的线程可以做到单个线程做不到的事情。例如,网络应用程序中,可以使用线程处理多种连接器。...可重入性与线程安全 可重入性:两个以上线程并行访问时,即使不按照调用顺序重叠运行代码,也必须保证结果; 线程安全:线程并行运行的情况下,虽然保证可以使程序正常运行,但访问静态空间或共享(堆等内存对象)对象时...一个线程安全的函数不一定是可重入的;一个可重入的函数缺也不一定是线程安全的!...可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...当线程被终止后,所有等待中的线程将会被唤醒。 警告:此函数比较危险,不鼓励使用。线程可以在代码执行的任何点被终止。线程可能在更新数据时被终止,从而没有机会来清理自己,解锁等等。。。
1.类结构及注释 1.1 类结构 ReentrantReadWriteLock是基于AQS实现的可重入的读写锁。这个锁在使用的时候将锁分为了两个部分,ReadLock和WriteLock。...实际上这两个锁都是共同引用的一个AQS对象,共用了一个AQS队列。其与ReentrantLock一样,具有公平/非公平的特性,以及可重入等功能。其类结构如下图所示: ?...此时我没也可以理解为什么对于AQS没用将这些需要实现的方法定位为抽象方法的原因。...在此实现中,由于此方法是显式的中断点,因此优先于对中断的响应而不是正常或可重入的锁获取。...需要注意的是,step不检查可重入获取,它被推迟到完整版本,以避免在更典型的的不可重入情况下检查和保留计数。
1 基本设计 ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。...具有与使用 synchronized 方法和语句访问的隐式监视器锁相同的基本行为和语义的可重入互斥锁,但具有扩展功能。 ReentrantLock 由最后成功锁定但尚未解锁的线程所拥有。...Sync 中的的同名抽象方法,再由两种模式的子类具体实现此抽象方法来获取锁。...失败,即获取锁失败,则进入 AQS 中已经定义并实现的 Acquire 方法善后 这里的 lock 方法并没有直接调用 AQS 提供的 acquire 方法,而是先试探地使用 CAS 获取了一下锁,...tryAcquire 是在子类中实现的,但是都需要对trylock 方法进行非公平的尝试。
假定这些条件之后,此类中的其他方法就可以实现所有排队和阻塞机制。 ...只支持独占模式或者只支持共享模式的子类不必定义支持未使用模式的方法。...可以根据需要使用用于其同步 机制的 AbstractQueuedSynchronizer 将这些方法导出到类中。 此类的序列化只存储维护状态的基础原子整数,因此已序列化的对象拥有空的线程队列。...需要可序列化的典型子类将定义一个 readObject 方法,该方法在反序列化时将此对象恢复到某个已知初始状态。...一段简单的代码 看构造 看类之间的关系,形成关系图 看使用到的方法,并逐步理解,边看 代码边看注释 debug 6.深入剖析ReentrantLock源码之公平锁的实现 6.1公平锁与非公平锁的区别
ReentrantLock,顾名思义重入锁,但什么是重入,这个锁到底是怎样的,我们来看看类的注解说明 ?...ReentrantLock是线程独占的,不能与其他线程共享。所谓的重入,就是当本线程想再次获得锁,不需要重新申请,它本身就已经锁了,即重入该锁。 为什么会允许锁重入呢?...AQS中核心的tryAcquire()方法并没有在这里实现,因为子类NonfaiSync和FairSync的实现并不一样。但这里同样需要用到nonfairTryAcquire,所以抽象出来了。...上文说到Sync内部类抽象了这个方法出来,说到子类都会用到,说的正是tryLock()方法需要用到。 所以显而易见的,无论是否公平锁,调用tryLock()都是用的非公平锁的方法。为什么呢?...至于其他成员函数,大都是围绕获取线程和队列的状态,没什么特别的,在这里不再赘述,有兴趣的可以看看源码。 总结 回顾下要点 ReentrantLock是一个可重入的锁(被当前占用的线程重入)。
使用一个无限队列来保存需要执行的任务,可以传入线程的数量;不传入,则默认使用当前计算机中可用的cpu数量;使用分治法来解决问题,使用fork()和join()来进行调用。...证明它还是一个线程任务类。那我们调用t.start()事实上就是调用了该类重写的run方法。 Worker为什么不使用ReentrantLock来实现呢?...大体思路是一样的,这里不做介绍。 Worker为什么不使用ReentrantLock来实现呢? tryAcquire方法它是不允许重入的,而ReentrantLock是允许重入的。...在runWorker方法中,为什么要在执行任务的时候对每个工作线程都加锁呢? shutdown方法与getTask方法存在竞态条件....比较深入的问题就是我在文中插入的问题。 …期望大家能在评论区补充。 End
工厂模式 Factory Method 在工厂模式中 父子类的关系就像是生产工厂中模具一样, 由父类负责指定实例生成的方式 子类来决定生成具体的类....具体的处理全部交给子类负责,目的就是为了将生产实例的框架和负责实例生产类解耦 示例程序 从下面这段示例来看看工厂模式到底能为我们做些什么。...在工厂模式中 我们将编写的包分离开来了,一个为framework(框架) 一个为具体的实现 这两个包的内容是平行的 如下图 类图 Product角色 这个角色属于框架的类型 ,它定义了工厂方法中生成的实例所持有的...方法的三种实现方式 在工厂包中的生成产品方法是抽象方法 也就是需要在子类中实现这个方法, 创建产品的实现方式一般有三种 指定一个抽象方法 实现默认的处理 如果自类没有实现方法 将会默认处理 在处理的其中抛出异常...使用模式与开发的小Tips 在日常开发中 使用模板方法或者是工厂模式的时候,因为要多读多个类的代码,缕清逻辑变得格外的重要,通常在设计模式设计子类的时候 需要想维护这些类的人员传达明确意图,擅自修改可能会出现事故
说说 sleep() 方法和 wait() 方法区别和共同点? 为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?...线程池 为什么要用线程池? 你会使用线程池吗? 如何创建线程池比较好?(推荐使用 ThreadPoolExecutor 构造函数创建线程池) ThreadPoolExecutor 类的重要参数了解吗?...几种常见的线程池了解吗?为什么不推荐使用FixedThreadPool? 如何设置线程池的大小? ...... AQS 简介 原理 AQS 常用组件。...锁 锁的常见分类 可重入锁和非可重入锁 公平锁与非公平锁 读写锁和排它锁 .........Atomic 原子类: 介绍一下 Atomic 原子类; JUC 包中的原子类是哪 4 类?
先看下 ReentrantLock 的类签名以及如何使用: public class ReentrantLock implements Lock, java.io.Serializable {} 典型用法...ReentrantLock 的默认实现和 synchronized 都是非公平锁。 可重入锁:锁是否可重入,就是一个线程是否可以多次获取同一个锁,若是,就是可重入锁。...Sync 类(或其子类)的方法来实现,因此先从 Sync 类入手分析,代码如下(部分省略): // 抽象类,继承了 AQS abstract static class Sync extends AbstractQueuedSynchronizer...{ // 获取锁的方法,由子类实现 abstract void lock(); // 非公平锁的 tryLock 方法实现 final boolean nonfairTryAcquire...state 的值,若修改成功,则表示成功获取到锁,将 owner 设为当前线程;否则就执行 AQS 中的 acquire 方法,具体可参考前文「JDK源码分析-AbstractQueuedSynchronizer
大家好,又见面了,我是你们的朋友全栈君。 QThread是一个低级(low-level)类,适合用于显式地构建长期运行的线程。...如果一个类的所有非静态函数都是可重入的或者是线程安全的,那么它就是可重入的或者是线程安全的。 一个QObject在它所”属于“或者有关联的线程中被创建。其各子对象也必须属于同一线程。...因此,想要在新线程中调用槽函数的开发者必须使用worker对象的方法;新的槽函数不应该被直接实现成子类化的QThread。...一个类是否是可重入的,在Qt的参考文档中有标记。通常情况下,任何没有被全局引用或者被其他共享数据引用的C++类都认为是可重入的。...由于从那些为Qt的图形用户界面支持提供编译的低级库上继承的局限性,QWidget和它的子类都是不可重入的。这样造成的后果之一就是我们不能在一个来自次线程的窗口部件上直接调用函数。
我们可以说 car.getOwner() 中,car 和 owner 是直接的朋友的。...任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”;否则就是“陌生人”。 我把上面条件按照1,2,3,4的顺序对应到下面这个类中。大家一起来看下。...由于亲合度降低,从而提高了类的可复用率和系统的扩展性。。 缺点 造成系统的不同模块之间的通信效率降低,使系统的不同模块之间不容易协调等缺点。 不直接通信,必然需要通过第三方转发的方式。...这就直接导致了系统中存在大量的中介类,大大增加了系统的复杂度。...这也是行家们归纳总结的。大家在使用的时候,适时注意就好。个人不建议太硬性要求(仅仅是个人建议)。