您的位置:首页 > 编程语言 > Java开发

【Java并发编程】基本概念

2017-04-19 23:23 274 查看
ThreadLocal:线程局部变量

Atomic_基本类型:private AtimicInteger count;让修饰的变量具备原子性,volatile不具备原子性

线程的通信:

方法一 (synchronized + wait notify)

synchronized代码块

锁对象

Object.wait(); 释放锁,并停止

Object.notify(); 不释放锁,并唤醒别的线程

例子:阻塞队列

方法二 (实时的)

CountDownLatch(次数)类

countDownLatch.countDown(); 要倒数够次数才会调下面的awatit

countDownLatch.await();

volatile

关键字 作用,使变量在多线程间可见性(不具备原子性即同步性)

private volatile int name;

不修饰:多线程去访问的时候,在自己的线程内存存在副本,其他线程无法感知修改

修饰:一旦多数据改变,会强制让线程的副本失效,进而去读主内存中的变量

脏读:访问的是旧数据,更新的的数据没有读到

多线程安全

当多个线程去访问某一个对象或者方法时,这个类始终都能表现出正确的行为,那说明这个类是线程安全的。synchronize,是给对象和方法加锁,加锁的代码叫“互斥区”。加锁之后会出现锁竞争问题。

synchronized

sysnchronized ,可以修饰方法和代码块。

修饰方法:获得的锁是对象锁,如果加static是class级别锁。

修饰代码块:

多个syn对象多把锁

多个syn对象多把锁

如果要多个对象一把锁,需要加static

锁重入

锁方法1调锁



1.synchronized关键字实现线程间同步的互斥工作

ReentrantLock 重入锁 (类似synchronized)可以加参数,公平锁和非公平

公平锁和非公平:

非公平的锁比公平锁效率高。公平,有顺序的,非公平是cpu自己分配的

使用:

1.private Lock lock = new ReentrantLock();实例化锁

2.lock.lock();代码块

3.lock.unlock(); 一定要解锁

4.private Condition condition = lock.newCondition();

condition.await(); //阻塞并释放锁

condition.signal();

5.嗅探 :就是尝试获取锁

ReentrantReadWriteLock 读写锁 读写分离的锁

读读共享,写写互斥,读写分离

高并发

网络层

服务层 (业务模块分流)

1.nginx,请求分发,分流。通过配置文件配置全重

业务上的分流。

2.lvs/haproxy并发,最高可达2000万

建议:业务尽可能做细颗粒度

java 或 Redis(做限流)

java可以通过信号量来实现。容量评估,一堆运维,产品人给出一个阈值。

8/2原则。80%的请求在20%时间内完成。

峰值qps = (总PV*80%)/(60*60*24*20%)

单机极限qps = 总峰值/机器数

数据库(最后的瓶颈)

Redis做缓存,数据库减压

设计模式与多线程

单例&多线程

//Future模式

类似 Ajax

客户端提交任务,服务器先不执行,先返回。等下次。就是异步请求

异步请求+回调

//Master-Worker模式

clinet(1) master(1) worker(n)

//生产者-消费者

生产者生产数据,消费者去消费

场景就是消息队列中间件MQ

1.多应用 2.生产与消费的销量不一致
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 并发