- 博客(15)
- 资源 (5)
- 问答 (4)
- 收藏
- 关注
原创 并发编程--读写锁ReadWriteLock和ReentrantReadWriteLock写锁与读锁(二)
在上一篇博客并发编程--读写锁ReadWriteLock和ReentrantReadWriteLock(一)中我们简单介绍了一下读写锁的相关知识,接下来来我们介绍一下读锁的实现机制,简单的来说写锁就是一个独占锁,如果看过ReentrantLock相关的知识,应该会对独占锁的实现有一些简单的理解,简单来说独占锁的实现是当锁标识位state为0时,当前线程获取锁,并将state进行加一操作,其他线程来
2017-04-25 20:18:47 1571
原创 并发编程--读写锁ReadWriteLock和ReentrantReadWriteLock(一)
Java并发编程包提供了读写锁的实现,其维护了一对相关的锁 — — “读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。“读取锁”用于只读操作,它是“共享锁”,能同时被多个线程获取。“写入锁”用于写入操作,它是“独占锁”,写入锁只能被一个线程锁获取。ReadWriteLock是一个接口。ReentrantReadWriteLock是它的实现类,ReentrantReadWriteLock
2017-04-25 20:18:15 1790
原创 并发编程--Semaphore计数信号量
Semaphore是一个计数信号量,它的本质是一个共享锁。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可(用完信号量之后必须释放,不然其他线程可能会无法获取信号量)。简单示例:public class Semaphore
2017-04-19 19:37:40 2956
原创 并发编程--CyclicBarrier屏障
CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。简单示例:public class CyclicBarrierLearn { private static int SIZE = 5; private static Cy
2017-04-18 19:55:01 900
原创 并发编程--CountDownLatch
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDown
2017-04-18 18:49:35 1829
原创 并发编程--并发编程包Condition条件
JDK并发编程包提供了Condition来对锁进行更精确的控制,Condition接口提供的方法还是很简单的,Condition是一个独占锁。Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个条件(Condition),只有当该条件具备( signal 或者 signalAll方法被带调用)时 ,这些等待线程才会被唤醒,从而重新争夺锁。Condition接口方法:
2017-04-18 18:18:50 1272
原创 并发编程--并发编程包LockSupport
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport主要提供了两个功能:(1)park()方法,用来阻塞线程。(2)unpark()方法,解除阻塞线程。LockSupport提供的park()和unpark()方法不会遇到Thread.suspend和Thread.resume所可能引起的死锁问题,因为park和unpark有许可的存在,调用park的线程和另一
2017-04-18 12:53:25 1093
原创 并发编程--AbstractQueuedSynchronizer介绍和原理分析
AbstractQueuedSynchronizer是并发编程包中最重要的类,是并发编程包的实现基层。简单来说,AbstractQueuedSynchronizer提供了一个基于FIFO的队列,用于存储处于阻塞状态的线程;提供了一个volatile修改的state变量,用于作为锁获取的标识位,对于FIFO队列和state的操作都是通过Unsafe这个类来实现CAS原子操作。 AQS的功能可以分为两
2017-04-17 21:09:19 2252 2
原创 并发编程--公平锁和非公平锁
在上一篇博客并发编程--互斥锁ReentrantLock中我们简单介绍了一下ReentrantLock,ReentrantLock提供了公平锁和非公平锁的机制,我们已经了解到ReentrantLock提供了一个FIFO线程队列,对于公平锁来说,当锁是可获取时首先让FIFO队列中的线程获取锁,当前线程需要进FIFO队列进行等待;对于非公平锁来说,当锁是可获取时,这个线程可以直接获取锁,不用在FIFO
2017-04-13 21:15:17 1525
原创 并发编程--互斥锁ReentrantLock
ReentrantLock是一个比较常用的锁,它是一个互斥锁,互斥锁的含义就是只能由某个线程进行操作,其他线程等到释放锁资源之后才能竞争锁;同时它又是可重入的,意思是它可以被单个线程多次获取。ReentrantLock可以获取公平锁和非公平锁,其区别的体现是获取锁的机制上是否公平,ReentrantLock在同一个时间点只能被一个线程获取(当某线程获取到“锁”时,其它线程就必须等待);Reentr
2017-04-13 19:55:34 897
原创 并发编程--并发编程框架概述
JDK给我们提供了一个并发编程的包java.util.current,并发编程包中是锁功能更加强大,并且他允许更灵活的使用锁。JUC包中的锁,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原语,Condition条件,AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSy
2017-04-13 18:25:06 1042
原创 并发编程--AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray
AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray是对数组的线程安全操作,简单来说其操作方式是使用sun.misc.Unsafe来对数组对象进行CAS原子操作。AtomicIntegerArray数组对象: private final int[] array;添加操作为: public final void set(int i, int
2017-04-05 19:13:17 1955
原创 并发编程--原子类AtomicLong、AtomicBoolean和AtomicReference
在上一篇博客 并发编程--原子类AotmicInteger中我们已经简单介绍了一下AtomicInteger相关的知识,简单来说AtomicLong的实现原理与AtomicInteger是相同的,用volatile来修饰变量value和使用sun.misc.Unsafe来完成对value的原子操作。源码如下:public class AtomicLong extends Number implem
2017-04-05 18:12:39 1717
原创 并发编程--原子类AotmicInteger
前几篇博客中我们已经介绍了线程、volatile、synchronized和cas自旋相关的知识,接下来我介绍一下jdk提供的并发编程包java.util.concurrent中相关的实现类知识。 AtomicInteger简单来说就是一个能进行原子操作的Integer,这样在多线程操作下对AtomicInteger的操作是原子操作的,操作后的值对所有线程都是立即可见的。简单来说其实现就是使用的v
2017-04-05 18:11:46 1792
原创 springMVC--动态验证码实现
在网站开发过程中我们一般都会为了防止用户连续提交都会提供验证码的功能,简单来说就是生成一个动态图片,在图片中保存一些校验信息,将校验信息放到session中和用户提交的验证码信息进行对比,如果出现错误则要提示验证码错误。提供一个简单实现的demo。@Controller@RequestMapping("/auth")public class AuthCodeController { pr
2017-04-01 10:43:49 3294
空空如也
Spring MVC注入的时候只能用@Autowired,不能使用set方法吗???
2016-04-11
求推荐linux文件共享软件
2015-09-06
java源码阅读方法以及经验
2014-11-29
TA创建的收藏夹 TA关注的收藏夹
TA关注的人