笔记
文章平均质量分 57
君安否
赶不上分针的时针,很慢,但不弃
展开
-
读写锁02
ReentrantReadWriteLock的进一步分析 ReadWriteLock是接口,我们实现读写锁实质是用接口的实现类ReentrantReadWriteLock ①ReentrantReadWriteLock拥有的特性 1.1获取顺序(公平和非公平) ReentrantReadWriteLock不会为锁定访问强加读或者写偏向顺序,但是它确实是支持可选的公平策略。 非公平模式(默认) 比公平锁更高的吞吐量。 公平模式 1.2可重入 写锁(写线程)可以在不释放已经拥有的写锁的情况下,重新获取读锁,原创 2022-03-26 14:19:23 · 74 阅读 · 0 评论 -
读写锁01
①ReadWriteLock同Lock一样也是一个接口, 提供了readLock和writeLock两种锁的操作机制,一个是读锁,一个是写锁。 读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的(排他的)。每次只能有一个写线程,但是可以有多个线程并发地读数据。 所有读写锁的实现必须确保写操作对读操作的内存影响。 换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。 理论上,读写锁比互斥锁允许对于共享数据更大程度的并发。 与互斥锁相比,读写锁是否能够提高性能取决于读写数据的频率、读取和原创 2022-03-25 20:18:47 · 89 阅读 · 0 评论 -
线程池02(扩展)
ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor实现了ScheduledExecutorService接口, 该接口定义了可延时执行异步任务和可周期执行异步任务的特有功能,相应的方法分别为: 1.达到给定的延时时间后,执行任务。这里传入的是实现Runnable接口的任务,因此通过ScheduledFuture. get()获取结果为null public ScheduledFuture<?> schedule(Runnable com原创 2022-03-24 16:28:57 · 65 阅读 · 0 评论 -
线程池01
线程池的创建 线程池的创建可以通过创建ThreadPoolExecutor对象或者调用Executors的工厂方法来创建线程池。但是在阿里巴巴的java开发手册中提到: [强制]线程池不允许使用Executors去创建,而是通过ThreadPoolExecutors的方式, 这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明: Executors 返回的线程池对象的弊端如下: 1.FixedThreadPool 和SingleThreadPool: 允许的请求队列长度为Integ原创 2022-03-23 18:12:25 · 577 阅读 · 0 评论 -
线程通信——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 · 170 阅读 · 0 评论 -
线程通信——Object方法实现
配合synchronized加锁的线程实现通信,可以借助Object类的三个方法wait().notify()和notifyAll() 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法, 无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞, 相当于让当前线程交出(释放)此同步锁,然后进入等待状态,等待后续再次获得此同步锁。 3)调用某个对象的notify()方法能够唤醒一个正在等待这个同步锁对象的线程,如果有多个线程都在等待这个同步锁对象,则只能唤原创 2022-03-20 19:33:43 · 129 阅读 · 0 评论 -
CountDownLatch,Semaphore与CyclicBarrier
CountDownLatch介绍 CountDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能, 即:一个线程或多个线程一直等待, 直到其他线程执行的操作完成。 CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会直处于阻塞状态, 直到其他线程调用countDown方法,每次调用countDown方法,计数器的值减1。 当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就原创 2022-03-14 17:31:19 · 129 阅读 · 0 评论 -
CAS算法的实现逻辑的理解
CAS: Compare and Swap,即比较再交换。 乐观锁和悲观锁 传统的锁机制,例如Java的synchronlzed关键字他代表了Java 中悲观锁技术,保证了某一时刻仅有一个线程能访问同步代码方法。synchronlzed 能够很好地工作,却有着(相对)比较大的性能开销。 乐观锁(相对悲观锁)对性能会有很大的帮助 他的核心思想是:你寄希望于在没有冲突的情况下完成一次更新操作,使用乐观锁技术更新时会进行“冲突检测"来判断是否有其他的线程干扰,若是(有其他线程干扰)则视本次更新操作失败,一般会进行原创 2022-03-12 19:13:07 · 205 阅读 · 0 评论 -
原子性操作问题的解决
什么是原子性操作? 即两个或多个线程涉及到同一个共享变量,且每一个线程都会更改共享变量的值,这些线程运行,要不同时成功,要不就一块失败返回原来的状态。 错误代码示例 上面是对变量serialNumber 进行自增操作,由于volatile保证了内存可见性,那么在每个线程中对serialNumber自增完之后,在其他线程中都应该能看到修改后的值,但是运行结里发现可能会在不同的线程中,看到了相同的数值 误区!! volatile关键字能保证内存可见性没有错,但是上面的程序错在没能保证原子性。可见性只能保证每次读原创 2022-03-11 17:29:47 · 367 阅读 · 0 评论 -
Volatile关键字与内存可见性
代码示例: 不加Volatile关键字时,子线程由于沉睡一秒,可以认为子线程和主线程是同时运行的,主线程把主内存的共享变量读取到了它的工作内存,同时子线程也把主内存的共享变量读取到了它的工作内存,这个时候,两个线程各自执行自己的,互不干扰。子线程虽然在后续执行中,把这个共享变量flag改成了true,并把它刷新回了主内存,但是,主线程在改之前就已经把共享变量读取到了它的工作内存,即读取为false,而主线程中的while循环是个空循环,就只有一个if判断语句,没有其他任何代码(如果有其他的一些代码操作,比如原创 2022-03-10 17:44:35 · 372 阅读 · 0 评论 -
2020-10-27
对大数据的初识 当今时代是互联网时代,人们的生活不断的在被数字化,随着时间推移,信息量也逐渐积累,其中的价值也不断增加,但是却十分零散,以至于人们很难去提取其中的价值,大数据技术便应用而生,它是一种提取其中的价值的有效手段,如同一张孔洞狭小的渔网,大鱼小雨一网打尽,任何技术的产生都是以服务人类为目的,大数据也是如此。在有序化信息管理中,人们的生活更加高效性,现在以及未来与物联网的结合更是将方便体现在各个方面,任何技术都有两面性,隐私泄露,网络安全等问题也陆续而...原创 2020-10-27 10:00:44 · 55 阅读 · 0 评论