Java Concurrency
文章平均质量分 87
DoUUnderstand
这个作者很懒,什么都没留下…
展开
-
Java 线程池 Executor框架(1)ThreadPoolExecutor
Executor框架的结构Executor框架主要包含三个部分: 任务:包括Runnable和Callable,其中Runnable表示一个可以异步执行的任务,而Callable表示一个会产生结果的任务 任务的执行:包括Executor框架的核心接口Executor以及其子接口ExecutorService。在Executor框架中有两个关键类ThreadPoolExecutor和Schedul原创 2017-05-15 19:28:46 · 1622 阅读 · 0 评论 -
线程通信(3) - 使用阻塞队列(Blocking Queue)控制线程通信
BlockingQueueBlockingQueue是队列的一种,但是他并不是作为一个容器,而是作为线程同步的工具。 BlockingQueue具有一个特征,当生存者线程试图向BlockingQueue中放入元素的时候,如果该队列已经满了,则该线程被阻塞;当消费者线程视图从BlockingQueue中取出元素时,如果该队列已空,则线程被阻塞。程序中两个线程交替向BlockingQueue中放入元素原创 2017-10-10 15:02:08 · 749 阅读 · 1 评论 -
Java中的锁 (2) 底层CAS
CASCAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包。CAS在多数CPU中只是一条指令,单挑指令是不会被中断的,因此保证了原子性;CAS应用CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。...转载 2017-10-11 14:04:08 · 468 阅读 · 0 评论 -
Java中的锁 (3) 同步器AQS (AbstractQueuedSynchronizer)
看了两天AQS CAS的内容,终于弄清楚了。下文多数内容来自《Java并发编程的艺术》在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),内部实现都依赖AbstractQueuedSynchronizer类。AQS它使用了一个int成员变量表示同步状态,原创 2017-10-12 22:00:04 · 307 阅读 · 0 评论 -
高并发秒杀系统优化
首先我们要清楚,高并发发生在哪些部分,然后正对不同的模块来进行优化 红色为高并发对性能影响较大的部分。 1.详情页部署到CDN节点上用户在秒杀开始之前,会对详情页做大量的刷新操作。 所以我们将详情页部署到CDN上,CDN将详情页做静态化处理。 这样其实用户访问的静态页的html已经不在秒杀系统上了,而在CDN节点上。 其实访问静态资源和静态页面是不用访问我们的系统服务器的,所以我们要单原创 2017-11-08 23:42:29 · 2781 阅读 · 0 评论 -
Java中的锁(4) 深入理解Synchronized实现原理
Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法: (1)对于修饰普通方法,锁是当前实例对象。 (2)对于修饰静态方法,锁是当前类的原创 2017-11-01 11:29:31 · 597 阅读 · 0 评论 -
Java中的锁(4) 深入理解ReentrantLock
理解了AQS和CAS之后,再来理解ReentrantLock就很简单了。ReentrantLock是可重入锁,什么是可重入锁呢?可重入锁就是当前持有该锁的线程能够多次获取该锁,无需等待。ReentrantLock中的公平锁和非公平锁首先我们先看看ReentrantLock的构造方法, 分为两种,公平锁和非公平锁。//默认非公平锁public ReentrantLock() { sync =原创 2017-10-14 17:33:48 · 383 阅读 · 0 评论 -
秒杀系统中的接口优化
在秒杀系统中我们如何对接口进行优化呢? 1.Redis预减库存减少数据库的访问 2.内存标记减少Redis的访问 3.请求先入队缓冲(RabbitMQ),异步下单 4. Nginx水平扩展解决超卖 1.数据库加唯一索引:防止用户重复购买 2.SQL加库存数量判断:防止库存变成负数 1.Redis预减少数据库的访问整个优化的核心思路还是减少对数据库...原创 2018-02-26 13:30:13 · 351 阅读 · 0 评论 -
RabbitMQ的安装和使用
RabbitMQ 特点RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展...原创 2018-02-26 18:12:06 · 2052 阅读 · 0 评论 -
线程通信(1) - wait与notify,多线程中的等待与通知机制
思考:一个线程修改了一个对象的值,而另一个线程感知其变化,然后进行相应的操作。整个过程开始于一个线程,执行终止于另一个线程。要如何用Java来实现这个功能呢?等待/通知机制等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操原创 2017-10-09 16:45:26 · 450 阅读 · 0 评论 -
Java 中的锁(1)synchronized与ReentrantLock
内置锁 synchronizedJava提供一种内置锁机制来支持原子性:synchronized,他是一种隐性锁,他隐式的获取锁,却把锁的获取与释放固化了。synchronized可以对方法和代码块进行同步//对方法同步public synchronized void method(){ ..............................}//对代码块同步public voi原创 2017-10-10 17:32:30 · 429 阅读 · 0 评论 -
JavaSE 详解ThreadLocal关键字
ThreadLocalThreadLocal为变量在每个线程中都创建了一个实例,所以每个线程可以访问自己内部的副本变量,不同线程之间不会互相干扰。ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。实现原理从线程Thread的角度来看,每个线程内部都会持有一个对ThreadLocalMap实例的引用,T原创 2017-06-21 11:04:58 · 1079 阅读 · 0 评论 -
Java 线程池
线程池 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池。 线程是稀缺资源,如果被无限制的创建,原创 2017-05-14 18:37:40 · 493 阅读 · 0 评论 -
Java 线程池 Executor框架(2)FutureTask
1原创 2017-06-18 09:53:41 · 288 阅读 · 0 评论 -
JavaSE 多线程(2)
死锁多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁. 为了避免死锁出现,最好不要同步代码块嵌套。 例子 饭桌上每个人都只有一边筷子,都在旁别的人把筷子借给自己吃饭 public class Demo5_DeadLock { /** * @param args */ private static String s1 = "筷子左";原创 2016-09-21 16:43:57 · 286 阅读 · 0 评论 -
JavaSE 详解volatile关键字
volatile特性(1)内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。(2)有序性:禁止进行指令重排序。如何保证内存可见性?在java虚拟机的内存模型中,有主内存和工作内存的概念,Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量原创 2017-06-20 14:30:26 · 838 阅读 · 0 评论 -
Java Collections Framework - ConcurrentHashMap
(1)线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所 以在并发情况下不能使用HashMap。例如,执行以下代码会引起死循环。final HashMap<String, String> map = new HashMap<String, String>(2); Thread t = ...原创 2017-09-08 14:03:36 · 360 阅读 · 0 评论 -
由一道题了解Happens - Before
首先来看一道题目:public class Test1 { private int a=1, b=2; public void foo(){ // 线程1 a=3; b=4; } public int getA(){ // 线程2 return a; } public int getB(){ //原创 2017-09-07 20:32:03 · 418 阅读 · 0 评论 -
JavaSE 多线程(1)
多线程的概述多线程具有随机性,谁抢到谁执行。多线程并行和并发的区别 -并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU) -并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。 -比如我跟两个网友聊天,左手操作一个电脑跟甲聊,同时右手用另一台电脑跟乙聊天,这就叫并行。 -如果用一台电脑原创 2016-09-19 22:02:37 · 1415 阅读 · 0 评论 -
Java多线程并发方面面试总结
进程和线程的区别:进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。线程:同一类线程共享代码和数据空间,每个线程有独立的工作内存和程序计数器(PC),线程切换开销小。线程间还可以通过共享的主内存来进行值的传递。 多进程是指操作系统能同时运行多个任务(程序)。 多线程是指在同一程序中有多个顺序流在执行。在java中要想实现多线程,有三种手段原创 2017-09-11 10:11:14 · 1227 阅读 · 0 评论 -
线程通信 (2)- Condition接口
如果程序不使用synchronized关键字来保证同步,而是使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能使用wait() ,notify(),notifyAll()方法来进行线程通行了。Condition当使用Lock对象来保证同步时,Java提供了一个Condition类来保持协调。condition实例的创建方法。Lock lock = new ReentrantLock原创 2017-10-09 20:18:29 · 298 阅读 · 0 评论 -
秒杀系统中的页面优化
秒杀系统中,并发的瓶颈在数据库,如何有效的减少对数据库的访问呢?最有效的方法就是加缓存,页面静态化、前后端分离、1.页面缓存什么是页面缓存呢,就是我们在访问页面时,不是直接让系统帮我们渲染页面,而是去缓存中去取,如果找到了就直接返回给客户端,如果没有我们就手动渲染模板,返回给客户端的同时,将结果缓存到如redis之类的缓存中,以便下次使用。这里我们使用Redis来缓存。以前,我...原创 2018-02-25 20:17:13 · 463 阅读 · 0 评论