自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 读写锁02

ReentrantReadWriteLock的进一步分析ReadWriteLock是接口,我们实现读写锁实质是用接口的实现类ReentrantReadWriteLock①ReentrantReadWriteLock拥有的特性1.1获取顺序(公平和非公平)ReentrantReadWriteLock不会为锁定访问强加读或者写偏向顺序,但是它确实是支持可选的公平策略。非公平模式(默认)比公平锁更高的吞吐量。公平模式1.2可重入写锁(写线程)可以在不释放已经拥有的写锁的情况下,重新获取读锁,

2022-03-26 14:19:23 65

原创 读写锁01

①ReadWriteLock同Lock一样也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是读锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的(排他的)。每次只能有一个写线程,但是可以有多个线程并发地读数据。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。理论上,读写锁比互斥锁允许对于共享数据更大程度的并发。与互斥锁相比,读写锁是否能够提高性能取决于读写数据的频率、读取和

2022-03-25 20:18:47 81

原创 线程池02(扩展)

ScheduledThreadPoolExecutorScheduledThreadPoolExecutor实现了ScheduledExecutorService接口,该接口定义了可延时执行异步任务和可周期执行异步任务的特有功能,相应的方法分别为:1.达到给定的延时时间后,执行任务。这里传入的是实现Runnable接口的任务,因此通过ScheduledFuture. get()获取结果为nullpublic ScheduledFuture<?> schedule(Runnable com

2022-03-24 16:28:57 60

原创 线程池01

线程池的创建线程池的创建可以通过创建ThreadPoolExecutor对象或者调用Executors的工厂方法来创建线程池。但是在阿里巴巴的java开发手册中提到:[强制]线程池不允许使用Executors去创建,而是通过ThreadPoolExecutors的方式, 这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明: Executors 返回的线程池对象的弊端如下:1.FixedThreadPool 和SingleThreadPool:允许的请求队列长度为Integ

2022-03-23 18:12:25 562

原创 例题:线程按序交替

编写一个程序,开启三个线程,这三个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出的结果必须按顺序显示。如:ABCABC…依次递归。使用Condition进行线程间通信即可(也可以使用wait()和noyify());代码示例import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Reentra

2022-03-22 18:10:44 89

原创 线程通信——Condition

ConditionLock类加锁的线程的condition类的await()/signal()/signalAll()来实现通信Condition是在java 1.5中才出现的,它用来替代传统的Object的walit). notify)实现线程间的协作,相比使用Object的wait()、notify(), 使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说,线程通信的实现比较推荐使用Condition<1>. Condition

2022-03-21 19:40:49 144

原创 线程通信——Object方法实现

配合synchronized加锁的线程实现通信,可以借助Object类的三个方法wait().notify()和notifyAll()1)wait().notify()和notifyAll()方法是本地方法,并且为final方法, 无法被重写.2)调用某个对象的wait()方法能让当前线程阻塞, 相当于让当前线程交出(释放)此同步锁,然后进入等待状态,等待后续再次获得此同步锁。3)调用某个对象的notify()方法能够唤醒一个正在等待这个同步锁对象的线程,如果有多个线程都在等待这个同步锁对象,则只能唤

2022-03-20 19:33:43 106

原创 CountDownLatch,Semaphore与CyclicBarrier

CountDownLatch介绍CountDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待, 直到其他线程执行的操作完成。CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会直处于阻塞状态, 直到其他线程调用countDown方法,每次调用countDown方法,计数器的值减1。当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就

2022-03-14 17:31:19 119

原创 CAS算法的实现逻辑的理解

CAS: Compare and Swap,即比较再交换。乐观锁和悲观锁传统的锁机制,例如Java的synchronlzed关键字他代表了Java 中悲观锁技术,保证了某一时刻仅有一个线程能访问同步代码方法。synchronlzed 能够很好地工作,却有着(相对)比较大的性能开销。乐观锁(相对悲观锁)对性能会有很大的帮助他的核心思想是:你寄希望于在没有冲突的情况下完成一次更新操作,使用乐观锁技术更新时会进行“冲突检测"来判断是否有其他的线程干扰,若是(有其他线程干扰)则视本次更新操作失败,一般会进行

2022-03-12 19:13:07 190

原创 原子性操作问题的解决

什么是原子性操作?即两个或多个线程涉及到同一个共享变量,且每一个线程都会更改共享变量的值,这些线程运行,要不同时成功,要不就一块失败返回原来的状态。错误代码示例上面是对变量serialNumber 进行自增操作,由于volatile保证了内存可见性,那么在每个线程中对serialNumber自增完之后,在其他线程中都应该能看到修改后的值,但是运行结里发现可能会在不同的线程中,看到了相同的数值误区!!volatile关键字能保证内存可见性没有错,但是上面的程序错在没能保证原子性。可见性只能保证每次读

2022-03-11 17:29:47 346

原创 Volatile关键字与内存可见性

代码示例:不加Volatile关键字时,子线程由于沉睡一秒,可以认为子线程和主线程是同时运行的,主线程把主内存的共享变量读取到了它的工作内存,同时子线程也把主内存的共享变量读取到了它的工作内存,这个时候,两个线程各自执行自己的,互不干扰。子线程虽然在后续执行中,把这个共享变量flag改成了true,并把它刷新回了主内存,但是,主线程在改之前就已经把共享变量读取到了它的工作内存,即读取为false,而主线程中的while循环是个空循环,就只有一个if判断语句,没有其他任何代码(如果有其他的一些代码操作,比如

2022-03-10 17:44:35 345

原创 2020-10-27

对大数据的初识当今时代是互联网时代,人们的生活不断的在被数字化,随着时间推移,信息量也逐渐积累,其中的价值也不断增加,但是却十分零散,以至于人们很难去提取其中的价值,大数据技术便应用而生,它是一种提取其中的价值的有效手段,如同一张孔洞狭小的渔网,大鱼小雨一网打尽,任何技术的产生都是以服务人类为目的,大数据也是如此。在有序化信息管理中,人们的生活更加高效性,现在以及未来与物联网的结合更是将方便体现在各个方面,任何技术都有两面性,隐私泄露,网络安全等问题也陆续而...

2020-10-27 10:00:44 47

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除