随笔分类 - 多线程、并发包和线程池
摘要:前言: synchronize会使用,但是对于深层次的知识,不是很清楚,故整理一篇博客。 简介: 能够保证在同一时刻,最多只有一个线程执行该端代码,以达到保证并发安全效果。 两种用法: 对象锁 类锁 概念: Java类可能有很多个对象,但只有一个Class对象。 本质: 所谓的类锁,不过是Class
阅读全文
摘要:1 普通方法上 2 静态方法上 修饰静态方法内置锁是当前的Class字节码对象 修饰普通方法内置锁是当前类的实例 原理与使用: 从字节码层面解释: 执行同步代码块 monitorenter synchronized( ){ } monitorexit 任何对象都可以作为锁,那么锁信息有存在对象的什么
阅读全文
摘要:引言: 在学习单例模式时候,用到了锁synchronized的概念,在多线程中又用到了CountDownLatch的概念 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 CountDownLatch是在java1.5被引入的,跟它一起被
阅读全文
摘要:1.sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会 2.yield()方法只会给相同优先级或更高优先级的线程以运行的机会 3.线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态 4.sleep
阅读全文
摘要:HashTable线程安全,效率非常低,锁的资源竞争 多线程共享同一个HashTable HashTable加锁了,影响效率。每次只能有一个线程去操作 put 和 get 只能有一个线程可以操作。 jdk5之后,引入了CurrentHashMap<K,V> 分段锁: 一个整体拆分成16段。每段是一个
阅读全文
摘要:方法一:直接用多线程之间的通讯去解决 方法二:join()去执行 解读:三个线程在交替执行,被cpu去调度。 如果调度的是t3 那么执行的是 t2.join() 此时t2线程又是跑了 t1.join(),一次类推、 总之 三个线程去调度时候 都是不确定的 每次的调度都是套着环在里面 每种可能性都有了
阅读全文
摘要:互斥锁,就是悲观锁,保证一个线程进去。线程会从sleep(加锁)--》runng(解锁) ,过程中有上下文的切换,cpu的抢占,信号的发送等开销。 自旋锁:线程一直都是running(加锁--》解锁),死循环检测锁位的标志位,机制不复杂。 自旋锁:由于自旋锁使用者一般保持锁时间非常短,因此选择自旋锁
阅读全文
摘要:原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法
阅读全文
摘要:悲观锁和乐观锁与CAS无锁机制很相关 乐观锁本质是无锁的 所以没有阻塞等待嘛 效率比较高 重试 --CAS无所机制 乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CA
阅读全文
摘要:相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应
阅读全文
摘要:锁的种类: 读写锁 悲观锁 乐观锁 CSA无锁 自旋锁 AQS 非公平锁 公平锁 互斥锁 排它锁 分布式锁(redis实现 和 zk实现) 轻量级锁(lock),重量级锁(synchronize) 重入锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized
阅读全文
摘要:根据前面我所说的Futrue模式,手写一个: 分别对应的Java代码,大家拿来参考: 启动类主函数: 结果: 大家对应着上一篇博客好好研究下,这个模式的应用场景还是蛮多的。代码挺有趣的。 当要获取资源的时候,data.getResult() ,如果资源没有准备好false;那么就会阻塞该线程。直到资
阅读全文
摘要:submit 和 excute是有啥区别 如果有这样的需求: 多线程实现下载,提高效率。 不论是Thread类还是Runnable接口重写run方法,有个特点就是没有返回值~~~~~~ 我都主线程 如何知道子线程程序执行完毕呢? 子线程执行完毕 立马告诉主线程 可以wait 和 notify 在Ja
阅读全文
摘要:在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。 lock锁 也叫显示锁 大家看下这个lock锁: lock是个接口 这个接口下面很多锁: 对于lock锁
阅读全文
摘要:从https://www.cnblogs.com/toov5/p/9837373.html 可以看到他的打印是一片一片的,这边博客介绍怎么避免掉 使用notify 和 wait的时候 要注意 是在synchronize进行的,持有同一把锁 1.因为涉及到对象锁,他们必须都放在synchronized
阅读全文
摘要:多线程之间如何实现通讯 什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 画图演示 多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。 代码实现基本实现 下面我们看个例子 生产者 消费者
阅读全文
摘要:线程池里面的submit 先来说下这个函数submit() 如果有个需求,实现下载 每个线程都会http请求 进行下载操作 run方法的缺点之一就是 没有返回值!! 多线程下载,实现下载时候 会有下载进度。 主线程如何知道子线程执行完毕? run() 里面的业务实现完毕后 可以用notify wai
阅读全文
摘要:CPU密集 CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。 CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就那些。 IO密集 IO密集型,即该任务需要大量的IO,
阅读全文