
多线程和并发
御镜堂
Hello,Future.
I'm coming now.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【多线程与并发】网站的并发,大流量访问怎解决?
一、HTML页面静态化访问频率较高但内容变动较小,使用网站HTML静态化方案来优化访问速度。将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略 。优势:减轻服务器负担; 加快页面打开速度,静态页面无需访问数据库,打开速度较动态页面有明显提高; 很多搜索引擎都会优先收录静态页面,不仅被收录的快,还收录的全,容易被搜索引擎找到; HTML静态页面不会受程...原创 2019-10-28 13:15:38 · 475 阅读 · 0 评论 -
【多线程和并发】生产者/消费者问题的多种实现方式
一、用阻塞队列实现import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingDeque;/** * @Author: Soldier49Zed * @Date: 2019/10/22 13:35 * @Description: *///Producer Class ...原创 2019-10-22 14:09:48 · 240 阅读 · 0 评论 -
【多线程和并发】的相关问题
实现线程之间的通信当线程间是可以共享资源时,线程间的通信是协调它们的重要的手段。1)Object类中wait() \ notify() \ notifyAll()方法。2)用Condition接口。Condition是被绑定到Lock上的,要创建一个Lock的Condition对象必须用newCondition()方法。在一个Lock对象里面可以创建多个Condition对象,线...原创 2019-10-21 17:35:36 · 271 阅读 · 0 评论 -
【多线程和并发】阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。1.ArrayBlockingQueueArra...原创 2019-10-21 15:31:47 · 268 阅读 · 0 评论 -
【多线程和并发】并发包的问题
并发包(Concurrent包)中含有的类有哪些?ConcurrentHashMap / CopyOnWriteArrayList阻塞队列同步辅助类线程池相关的类Lock接口原子类同步辅助类1)CountDownLatch:闭锁它就相当于一个计数器。用一个给定的数值初始化CountDownLatch,之后计数器就从这个值开始倒计数,知道计数值达到0。CountD...原创 2019-10-20 15:02:27 · 313 阅读 · 0 评论 -
【多线程和并发】CopyOnWriteArrayList的实现原理
CopyOnWrite容器即写时复制的容器,也就是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器(改变引用的指向)。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思...原创 2019-10-20 12:13:23 · 311 阅读 · 0 评论 -
【多线程和并发】简述Java的内存模型
它和JVM内存模型不一样Java内存模型主要分为两块,一块为主内存,一块为工作内存。Java内存模型规定所有的变量都在存放在主内存当中,每个线程都有自己独立的工作内存。线程对变量的所有操作都必须在工作内存当中进行,而不能直接对主内存进行操作,并且每个线程都不能访问其它线程的工作内存。Java内存模型的Volatile关键字和原子性、可见性、有序性和happens-before关系...原创 2019-09-19 10:33:07 · 206 阅读 · 0 评论 -
【多线程和并发】简述volatile关键字
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层含义:1)保证了不同线程对这个变量进行读取时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(volatile解决了线程间共享变量的可见性问题)使用volatile关键字会强制将修改的值立即写入内存: 使用volatile关键字的话,当线程2进行修改时,会导致线程1的工...原创 2019-09-17 22:18:46 · 179 阅读 · 0 评论 -
【多线程和并发】缓存一致性问题?如何解决?
当程序在运行过程中,会将运算需要的数据从主从复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从他的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如:i = i + 1;当线程执行这个语句的时候,会先从主存中读取i的值,然后复制一份到高速缓存中,然后CPU执行指令对i进行+1操作,然后将数据写入高速缓存,最后将高速缓存中...原创 2019-10-20 11:27:15 · 1632 阅读 · 0 评论 -
【多线程和并发】ThreadLocal
ThreadLocal相当于一个容器,用于存放每个线程的局部变量。ThreadLocal实例通常来说都是private static类型的。ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。一般情况下,通过ThreadLocal.set()到线程中的对象是该线程自己使用的对象,其他线程是访问不到的,各个线程中访问的是不同的对象...原创 2019-09-26 11:28:12 · 216 阅读 · 0 评论 -
【多线程与并发】锁的种类以及锁的优化
多线程中锁的种类一、可重入锁ReentrantLock和synchronized都是可重入锁如果当前线程已经获得了某个监视器对象所持有的锁,那么该线程在该方法中调用另外一个同步方法也同样持有该锁。比如:public synchronized void test(){ xxxxxx; test2();}public synchronized void...原创 2019-09-26 11:15:44 · 311 阅读 · 0 评论 -
【多线程与并发】如果不用锁机制如何实现共享数据访问
前提:不能用锁,不能用synchronize块或者方法,也不能直接使用jdk提供的线程安全的数据结构,需要自己实现一个类来保证多个线程同时读写这个类中的共享数据是线程安全的。无锁化编程的常用方法:硬件CPU同步原语CAS(Compare And Swap),如无锁栈、无锁队列(ConcurrentLinkedQueue)等待。现在几乎所有的CPU指令都支持CAS的院子操作,X86下对应的...原创 2019-09-25 13:04:32 · 3181 阅读 · 1 评论 -
【多线程与并发】线程池的问题
什么是线程池?线程池的工作原理和使用线程池的好处?一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行任务的任务队列(阻塞队列)。默认情况下,在创建了线程池后,线程池中的线程数为0。当任务提交给线程池之后的处理策略如下:如果此时线程池中的数量小于corePoolSize(核心池的大小),即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务(也就是每来一个任务...原创 2019-09-22 18:19:31 · 478 阅读 · 0 评论 -
【多线程和并发】Java中的线程池的实现原理
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池。合理使用线程池能带来三个好处:降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行; 提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,...原创 2019-09-15 23:57:06 · 732 阅读 · 0 评论 -
【多线程和并发】实现多线程的方式
Java中有四种实现多线程的方式一、继承了Thread类创建线程定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体 创建Thread子类的实例,即创建线程对象 调用线程对象的start()方法来启动该线程。class MyThread extends Thread{ public void run(...原创 2019-09-20 10:29:33 · 186 阅读 · 0 评论 -
【多线程和并发】实现多线程的同步
在多线程的环境中,经常会遇到数据的共享问题,即当多个线程调用需要访问同一资源时,他们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将会是不可预料的,在这种情况下,就必须对数据进行同步。在Java中,提供了四种方式来实现同步互斥访问:synchronized和Lock和wait() / notify() / notifyAll()方法和CAS。一、sync...原创 2019-09-20 10:32:02 · 417 阅读 · 0 评论 -
【多线程和并发】死锁
死锁产生的原因1)竞争可重用不可抢占式的资源2)竞争可消耗资源3)进程推进顺序不当.可重用性资源:可供重复使用多次的资源.不可抢占性资源:一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程使用完后自动释放.可消耗资源:又叫临时性资源,它是在进程运行期间,由进程动态的创建和消耗的.产生死锁的四个必要条件1)互斥条件:一个资源每次只能被一个进程使用;...原创 2019-09-20 16:58:42 · 337 阅读 · 0 评论