慕課網(wǎng) Jimin老師 Java并發(fā)編程入門與高并發(fā)面試 學(xué)習(xí)筆記
Java并發(fā)編程入門與高并發(fā)面試
包括:
線程安全传于、線程封閉、線程調(diào)度醉顽、同步容器沼溜、并發(fā)容器、AQS游添、J.U.C
解決思路:
擴(kuò)容系草、緩存、隊(duì)列否淤、拆分悄但、服務(wù)降級(jí)與熔斷、數(shù)據(jù)庫(kù)切庫(kù)石抡、分表分庫(kù)檐嚣、等等
并發(fā)及并發(fā)的線程安全處理
- 線程安全性
原子性、可見(jiàn)性啰扛、有序性嚎京、atomic包、CAS算法隐解、synchorized與Lock鞍帝、volatile、happes-before - 安全發(fā)布對(duì)象
安全發(fā)布方法煞茫、不可變對(duì)象帕涌、final關(guān)鍵字使用、不可變方法续徽、線程不安全類與寫法 - 線程安全手段
堆棧封閉蚓曼、ThreadLocal線程封閉、JDBC的線程封閉钦扭、同步容器纫版、并發(fā)容器、J.U.C - AQS及其他J.U.C組件
CountDownLatch. Semaphore.CyclicBarier. ReentrantLock與鎖客情、Condition, FutureTask其弊、ForkJoin框架癞己、BlockingQueue - 線程池
new Thread弊端、線程池的好處梭伐、ThreadPoolExecutor.Executor框架接口 - 額外補(bǔ)充
死鎖的產(chǎn)生與預(yù)防痹雅、多線程并發(fā)最佳實(shí)踐、Spring 的線程安全籽御、HashMap和ConcurrentHashMap深入講解
200線程同時(shí)執(zhí)行時(shí)候,count只有4890练慕,如果threadTotal 改成1,則是5000技掏,就是線下測(cè)試時(shí)候一直都是對(duì)的铃将,放到線上并發(fā)大了,就老是會(huì)出問(wèn)題哑梳!
@Slf4j
public class MapExample {
//200個(gè)線程同時(shí)執(zhí)行
private static int threadTotal = 200;
private static int clientTotal = 5000;
private static Map<Integer, Integer> map = Maps.newHashMap();
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
for (int index = 0; index < clientTotal; index++) {
final int threadNum = index;
exec.execute(() -> {
try {
semaphore.acquire();
func(threadNum);
semaphore.release();
} catch (InterruptedException e) {
log.error("exception", e);
e.printStackTrace();
}
});
}
exec.shutdown();
log.error("count:{}", map.size());//count:4890
}
private static void func(int threadNum) {
map.put(threadNum, threadNum);
}
}
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
@Slf4j
public class CountExample {
private static int threadTotal = 200;
private static int clientTotal = 5000;
private static long count = 0;
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
for (int index = 0; index < clientTotal; index++) {
exec.execute(() -> {
try {
semaphore.acquire();
add();
semaphore.release();
} catch (InterruptedException e) {
log.error("exception", e);
e.printStackTrace();
}
});
}
exec.shutdown();
log.error("count:{}", count);//count:4911
}
private static void add() {
count++;
}
}
并發(fā)基本概念
并發(fā):同時(shí)擁有兩個(gè)或者多個(gè)線程劲阎,如果程序在單核處理器上運(yùn)行多個(gè)線程將交替地?fù)Q入或者換出內(nèi)存,這些線程是同時(shí)"存在"的,每個(gè)線程都處于執(zhí)行過(guò)程中的某個(gè)狀態(tài)如果運(yùn)行在多核處理器上,此時(shí),程序中的每個(gè)線程都將分配到一個(gè)處理器核上,因此可以同時(shí)運(yùn)行.
高并發(fā):
高并發(fā)( High Concurrency )是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一 ,它通常是指,通過(guò)設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請(qǐng)求.
高并發(fā)處理的思路及手段
1鸠真、擴(kuò)容:水平擴(kuò)容悯仙、垂直擴(kuò)容的探討
2、緩存:Redis. Memcache吠卷、 Guava Cache等的介紹與使用
3锡垄、隊(duì)列:Kafka、RabbitMQ祭隔、RocketMQ等隊(duì)列特性介紹及使用隊(duì)列的關(guān)注點(diǎn)
4货岭、應(yīng)用拆分:服務(wù)化Dubbo與微服務(wù)Spring Cloud介紹
5、限流:Guava Ratel imiter的介紹與使用疾渴、常用限流算法千贯、自己實(shí)現(xiàn)分布式限流等
6、服務(wù)降級(jí)與服務(wù)熔斷:服務(wù)降級(jí)的多種選擇搞坝、Hystrix介紹及使用等
7搔谴、數(shù)據(jù)庫(kù)切庫(kù)、分庫(kù)桩撮、分表:介紹切庫(kù)敦第、分表、支持多數(shù)據(jù)源的原理及實(shí)現(xiàn)
8店量、高可用的一些手段:任務(wù)調(diào)度分布式elastic-job.主備curator的實(shí)現(xiàn)芜果、監(jiān)控報(bào),警機(jī)制等