【Java并发编程】基本概念

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】)