获得徽章 13
#每天一个知识点#
synchronized的不⾜之处
如果临界区是只读操作,其实可以多线程⼀起执⾏,但使⽤synchronized的
话,同⼀时间只能有⼀个线程执⾏。
synchronized⽆法知道线程有没有成功获取到锁
使⽤synchronized,如果临界区因为IO或者sleep⽅法等原因阻塞了,⽽当前
线程⼜没有释放锁,就会导致所有线程等待。
#每天一个知识点#
阻塞队列的原理很简单,利⽤了Lock锁的多条件(Condition)阻塞控制。接下来
我们分析ArrayBlockingQueue JDK 1.8 的源码。
⾸先是构造器,除了初始化队列的⼤⼩和是否是公平锁之外,还对同⼀个锁
(lock)初始化了两个监视器,分别是notEmpty和notFull。这两个监视器的作⽤⽬
前可以简单理解为标记分组,当该线程是put操作时,给他加上监视器notFull,标记
这个线程是⼀个⽣产者;当线程是take操作时,给他加上监视器notEmpty,标记这
个线程是消费者。
#每天一个知识点#
跨域是指在传输过程中双方的协议、域名、端口三个中有一个不相同时出现的跨预请求。浏览器为了避免CSRF攻击从而采取一种限制跨域资源共享的方案,你可以使用CROS设置请求头来解决跨域问题。
#每天一个知识点#
AQS是 AbstractQueuedSynchronizer 的简称,即 抽象队列同步器 ,从字⾯意思上理解:
抽象:抽象类,只实现⼀些主要逻辑,有些⽅法由⼦类实现;
队列:使⽤先进先出(FIFO)队列存储数据;
同步:实现了同步的功能。
那AQS有什么⽤呢?AQS是⼀个⽤来构建锁和同步器的框架,使⽤AQS能简单且
⾼效地构造出应⽤⼴泛的同步器,⽐如我们提到的ReentrantLock,Semaphore,
ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS
的
#每天一个知识点#
乐观锁:
乐观锁⼜称为“⽆锁”,顾名思义,它是乐观派。乐观锁总是假设对共享资源的访问
没有冲突,线程可以不停地执⾏,⽆需加锁也⽆需等待。⽽⼀旦多个线程发⽣冲
突,乐观锁通常是使⽤⼀种称为CAS的技术来保证线程执⾏的安全性。
由于⽆锁操作中没有锁的存在,因此不可能出现死锁的情况,也就是说乐观锁天⽣
免疫死锁。
乐观锁多⽤于“读多写少“的环境,避免频繁加锁影响性能;⽽悲观锁多⽤于”写多读
少“的环境,避免频繁失败和重试影响性能。
下一页