Java并发
文章平均质量分 87
chenkaibsw
加油
展开
-
Java多线程
1.多线程1)引例:创建四个线程卖票,一共有100张票(票数设置为静态变量,即四个线程共享),如果票数大于0,就让每个线程不停的将票数减一。具体的实现代码如下:class Ticket extends Thread{ static int ticket = 100; //让四个对象共享100张票(一般不用静态,生命周期太长) public void run() {原创 2018-01-13 15:42:38 · 198 阅读 · 0 评论 -
redis—分布式锁
Redis分布式锁的知识点:1.要设置有效时间,这是基于如果逻辑执行到中间出现异常,没有执行del释放锁,就会导致死锁,所以要使用expire设置有效时间。2.setnx和expire指令是可以同时执行的。3.第一个线程执行逻辑的时间过长,超过了锁的超时限制,此时第二个线程就会获取到锁,第一个线程执行完逻辑会把锁释放,第三个线程会在第二个线程执行代码逻辑时,重新获取锁。解决办法是将value设置一个随机值,释放锁前先匹配随机值是否一致。注意匹配value和删除key不是原子操作,此时需要lu原创 2021-08-26 22:14:03 · 168 阅读 · 0 评论 -
线程池是否需要关闭的问题测试
1.不关闭 static AtomicInteger integer = new AtomicInteger(0); static ExecutorService es; private static void execute(){ es = Executors.newFixedThreadPool(3); es.execute(() -> { integer.getAndAdd(1); Sys原创 2021-06-19 10:54:46 · 1387 阅读 · 4 评论 -
tinyint(1)和tinyint(4)的区别和用法
1 bytes = 8 bit ,一个字节最多可以代表的数据长度是2的8次方 11111111 在计算机中也就是-128到1271.BIT[M]位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为12.TINYINT[(M)] [UNSIGNED] [ZEROFILL]M默认为4很小的整数。带符号的范围是-128到127。无符号的范围是0到255。3.BOOL,BOOLEAN是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。4....转载 2020-06-04 09:08:23 · 3423 阅读 · 0 评论 -
线程池整理
内容来自博客:https://www.cnblogs.com/dolphin0520/p/3932921.html#!comments1.使用线程池的原因:使用线程池的两个原因:1)Java线程的创建和销毁需要一定的开销,如果为每一个任务创建一个线程来执行,这些线程的创建和销毁将消耗大量的计算资源。2)Java线程被意义映射到本地操作系统线程,Java线程启动时会创建一个本地操作系...转载 2018-07-22 21:16:47 · 225 阅读 · 0 评论 -
HashMap笔记
HashMap中中的Node类:static class Node<K,V> implements Map.Entry<K,V> { final int hash; //hash值,与长度减1相与,用来定位数组索引位置 final K key; //键 V value; //值 ...原创 2018-07-21 16:23:59 · 343 阅读 · 0 评论 -
Java中线程安全的加一(+1)操作的三种方式
1.锁分为乐观锁和悲观锁,悲观锁总是假设每次的临界区操作会产生冲突,如果多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待。而乐观锁,它会假设对资源的访问都是没有冲突的,所有的线程都可以在不停顿的状态下持续执行,如果遇到冲突,乐观锁采用的叫做比较交换(CAS Compare And Swap)来鉴别线程冲突,一旦检测到冲突产生,就尝试当前操作直到没有冲突为止 。2.锁的必要性:引...原创 2018-07-07 21:18:50 · 8734 阅读 · 2 评论 -
AtomicInteger 中 incrementAndGet与getAndIncrement 两个方法的区别
通过查看JDK的API知道:intincrementAndGet() 以原子方式将当前值加 1。 intgetAndIncrement() 以原子方式将当前值加 1。字面解释都一样。再进行源代码查看:public final int getAndIncrement() { for (;;) { int current = get(); ...转载 2018-07-13 15:13:21 · 3611 阅读 · 0 评论 -
高效读取CopyOnWriteArrayList
1.使用场景:读操作远远大于写操作,比如有些系统级别的信息,往往需要加载或者修改很少的次数,但是会被系统内的所有模块频繁的访问。特点:这种链表,读取完全不用加锁,写入也不会阻塞读取,只有写入和写入之间需要进行同步等待。缺点:1)占用内存,每次执行写操作都要将原容器拷贝一份,数据量大时,对内存压力较大,可能会引起频繁GC 2)无法保证实时性,Vector对于读写操作都同步,保证了读...原创 2018-07-07 14:52:02 · 1014 阅读 · 0 评论 -
并发—ThreadLocal笔记
使用示例:public class Test { public static class MyRunnable implements Runnable { private ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); @Override pub...原创 2018-07-19 15:35:24 · 880 阅读 · 0 评论 -
Java阻塞队列学习小结
博客:https://blog.csdn.net/suifeng3051/article/details/48807423https://blog.csdn.net/chenchaofuck1/article/details/51660119https://blog.csdn.net/suifeng3051/article/details/48807423PriorityBlockingQueue...原创 2018-07-06 19:36:19 · 425 阅读 · 1 评论 -
CountDownLatch、Semaphone学习
学习博客笔记https://www.cnblogs.com/dolphin0520/p/3920397.html1.CountDownLatch(倒计数器)作用:latch(门闩),门闩的含义:把门锁起来,不让里面的线程跑出来,因此,这个工具通常用来控制线程等待,它可以让某个线程等待直到倒计时结束,再开始执行。CountDownLatch的构造函数接收一个整数N作为参数,即当前这个计数...原创 2018-07-06 14:50:41 · 1878 阅读 · 0 评论 -
并发中几个常出现的问题
1.卖票问题中出现的错误及分析:class Ticket extends Thread { static int ticket = 100; //让四个对象共享100张票(一般不用静态,生命周期太长) public void run() { while(true) { ...原创 2018-05-12 22:26:24 · 819 阅读 · 0 评论 -
读写锁
1.由于读和读之间并不对数据的完整性造成破坏,所以读写锁允许多个线程同时读,但是读写操作、写写操作之间仍然要相互等待和持有锁的。而重入锁在读和读互斥等待浪费了时间。1)读写锁使用方法: ReadWriterLock rwlock = new ReentranReadWriterLock(); rwlock.writeLoc...原创 2018-05-13 15:51:52 · 1702 阅读 · 0 评论 -
使用锁模拟写一个阻塞队列(马士兵并发笔记)
写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持多个生产者和多个消费者线程拥塞调用。1.使用synchronized锁或ReentrantLock锁实现1)使用synchronized锁的notify、notifyAll来实现基本思路:使用put方法向容器中添加元素,使用get方法从容器中取出元素,在使用put方法添加元素的时候进行判断,如果容器已经满...原创 2018-05-24 19:22:54 · 592 阅读 · 0 评论 -
多线程编程核心技术课本知识点页码记录
多线程编程核心技术:1).4页一个进程正在运行时至少会有1个线程在运行2)4页实现多线程有两种方式:一种继承Thread类,另一种实现Runnable接口继承Thread类局限:不支持多继承,不能共享3)7页start方法创建顺序不代表线程启动的顺序4)9页Thread.java类也实现了Runnable接口,那也就意味意味着构造函数Thread(Runnable target)不光可以传入Run...原创 2018-06-30 16:13:20 · 208 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
转自海子的博客:https://www.cnblogs.com/dolphin0520/p/3920373.htmlJava并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键...转载 2018-07-02 16:08:07 · 125 阅读 · 1 评论 -
Fork/Join框架介绍
转自https://blog.csdn.net/TimHeath/article/details/71307834Fork/Join框架介绍Fork/Join框架是Java 7提供了的一个用于并行执行任务的框架, 大概是怎样子的呢,就是一个把大任务分割成若干个小任务,最终把每个小任务结果汇总起来得到大任务结果的框架。有点像是归并排序。下面的图就能很好地体现出来工作窃取模式(work-stealin...转载 2018-07-10 16:23:28 · 410 阅读 · 0 评论 -
Java中的join方法原理详解
1.synchronized中的对象锁是线程的实例我们可以使用同步语句块的方式对需要同步的代码进行包裹。Object obj = new Object();synchronized(obj){ obj.wait(); //线程在这里等待}此时线程会在obj.wait()处等待,如果想继续执行,此时需要别的线程通过notify、notifyAll唤醒或者中断。但是如果o...原创 2018-07-04 16:17:46 · 10248 阅读 · 15 评论 -
Java多线程面试题及解答
转自:http://ifeve.com/15-java-faq/Java 线程面试问题在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的。他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有足够的J...转载 2018-07-23 15:08:19 · 252 阅读 · 0 评论 -
JAVA多线程和并发基础面试问答
转自:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/Java多线程面试问题1. 进程和线程之间有什么不同?一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的...转载 2018-07-23 15:09:06 · 171 阅读 · 0 评论 -
ConcurrentHashMap源码整理
转自https://blog.csdn.net/justloveyou_/article/details/72783008,这是我的阅读笔记,自己做了部分修改。1.ConcurrentHash的介绍:通过段(Segment)将ConcurrentHashMap划分为不同的部分,ConcurrentHashMap就可以使用不同的锁来控制对哈希表的不同部分的修改,从而允许多个修改操作并发进行,...转载 2018-07-18 16:52:52 · 686 阅读 · 0 评论 -
synchronized和ReentrantLock的区别小结
1.相比synchronized,ReentrantLock(重入锁)增加了一些高级功能等待可中断——对于synchronized,如果一个线程正在等待锁,那么结果只有两种情况,要么获得这把锁继续执行 ,要么就保持等待。而使用ReentrantLock,如果一个线程正在等待锁,那么它依然可以收到通知,被告知无需再等待,可以停止工作了。注意:这里说的是一个线程正在等待锁即没有获得锁,而不是说获得锁后...原创 2018-05-12 21:36:06 · 2714 阅读 · 0 评论