摘要:并发编程中,`ReentrantLock`的使用是比较多的,包括之前讲的`LinkedBlockingQueue`和`ArrayBlockQueue`的内部都是使用的`ReentrantLock`,谈到它又不能的不说AQS,AQS的全称是`AbstractQueuedSynchronizer`,这个类也是在`java.util.concurrent.locks`下面,提供了一个FIFO的队列,可以用于构建锁的基础框架,内部通过原子变量`state`来表示锁的状态,当`state`大于0的时候表示锁被占用,如果state等于0时表示没有占用锁,`ReentrantLock`是一个重入锁,表现在`state`上,如果持有锁的线程重复获取锁时,它会将`state`状态进行递增,也就是获得一个信号量,当释放锁时,同时也是释放了信号量,信号量跟随减少,如果上一个线程还没有完成任务,则会进行入队等待操作。 阅读全文
posted @ 2019-07-13 15:00 BattleHeart 阅读 (401) 评论 (0) 编辑
摘要:为了避免频繁重复的创建和销毁线程,我们可以让这些线程进行复用,在线程池中,总会有活跃的线程在占用,但是线程池中也会存在没有占用的线程,这些线程处于空闲状态,当有任务的时候会从池子里面拿去一个线程来进行使用,当完成工作后,并没有销毁线程,而是将将线程放回到池子中去。 阅读全文
posted @ 2019-07-12 10:32 BattleHeart 阅读 (259) 评论 (0) 编辑
摘要:前面已经讲解了公平模式的内容,今天来讲解下关于非公平模式下的SynchronousQueue是如何进行工作的,在源码分析的时候,先来简单看一下非公平模式的简单原理,它采用的栈这种FILO先进后出的方式进行非公平处理,它内部有三种状态,分别是REQUEST,DATA,FULFILLING,其中REQUEST代表的数据请求的操作也就是take操作,而DATA表示的是数据也就是Put操作将数据存放到栈中,用于消费者进行获取操作,而FULFILLING代表的是可以进行互补操作的状态,其实和前面讲的公平模式也很类似。 阅读全文
posted @ 2019-05-18 23:06 BattleHeart 阅读 (322) 评论 (0) 编辑
摘要:SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。一个读操作需要等待一个写操作,相当于是交换通道,提供者和消费者是需要组队完成工作,缺少一个将会阻塞线程,知道等到配对为止。 SynchronousQueue是一个队列和栈算法实现,在SynchronousQueue中双队列FIFO提供公平模式,而双栈LIFO提供的则是非公平模式。 对于SynchronousQueue来说,他的put方法和take方法都被抽象成统一方法来进行操作,通过抽象出内部类Transferer,来实现不同的操作。 阅读全文
posted @ 2019-05-11 20:08 BattleHeart 阅读 (4417) 评论 (3) 编辑
摘要:既然没有华丽的出场,那就平凡的分享,首先我要说明一点本篇文章针对Git初学者,对我自己学Git的资源的整合,其实本篇索引应该在我写Git系列文章的时候就紧跟着放上索引的,由于时间问题没有来得及整理,这里我详细整理下文章内容。其实说到git的文章已经很多了,这里分享下我的学习过程和自己摸索的过程。 阅读全文
posted @ 2016-03-11 23:18 BattleHeart 阅读 (1157) 评论 (6) 编辑
摘要:一、文件,指令讲解 首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库里面新建了version.txt内容也是一样的v1.0: 阅读全文
posted @ 2016-01-14 21:22 BattleHeart 阅读 (1285) 评论 (0) 编辑
摘要:开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库git init。 $ git init 然后我们来创建两个文件文件名分别为a和b。 $ touch a b 将a文件添加到暂存区,然后再将b添加到暂存区,我们会想到这时候有两个git对象产生,但是git对象对应.git/objects文件。 $ git add . $ find .git/objects/ .git/objects/ .git/objects/e6 .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 .git/objects/info .git/objects/pack 我们来查看下.git/objects文件下面会产生几条git对象库。这时候超出了我们想象,我们认为对象文件也应该创建两个但是仅仅创建了一个,这是为什么呢?那么着一个文件又指的是什么呢? $ git cat-file -t e6 阅读全文
posted @ 2016-01-14 15:19 BattleHeart 阅读 (4837) 评论 (1) 编辑
摘要:一、撤销指令 git checkout还原工作区的功能 git reset 还原暂存区的功能 git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 git revert 撤销本次提交。 二、指令讲解 Git checkout 首先我们对文件的一个修改,对master.txt进行了修改 阅读全文
posted @ 2016-01-14 08:48 BattleHeart 阅读 (1342) 评论 (6) 编辑
摘要:1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库 git init –bare git 创建一个裸仓库 2.git仓库有三个区域 工作区working directory日常编辑代码的地方 历史仓库history repository是commit指向的一个树形结构 暂存区Staging area相当于是工作区与历史提交中间的缓存,它代表着是你要提交代码的一个工作状态,它维护的是一个虚拟的树形结构 阅读全文
posted @ 2016-01-13 19:37 BattleHeart 阅读 (4345) 评论 (2) 编辑
摘要:配置提交代码的信息,例如是谁提交的代码之类的。 git config –global user.name BattleHeaert 这里是设置提交代码的人的名称 git config –global user.email github@126.com 这里是设置提交代码的人的邮箱 查看当前的用户名 git config user.name 或者 git config –get user.name 这时候会显示BattleHeart这个用户名,但是如果我们再添加一个用户的名称的时候这时候就会显示最后一个添加的用户名 git config –global –add user.name BH 当我们再次使用git config user.name时这时候显得是就是BH如下图所示 阅读全文
posted @ 2016-01-13 13:00 BattleHeart 阅读 (1754) 评论 (1) 编辑