并发和高并发概念
在讲高并发示例之前,先来普及一下并发和高并发的概念,磨刀不误砍柴工,只有了解了概念,才能更好的理解高并发发生的前因后果,而后才能解决问题
并发:同时拥有两个或多个线程,如果程序在单核处理器上运行,多个线程将交替换入或换出内存,这些线程在我们肉眼中它们是同时“存在”的(其实是cpu运行速度过快而导致我们肉眼看不到,误以为两个或多个以上的线程”同时“”运行),如果两个或多个线程运行在多核处理器上,此时程序中的每个线程都将分配到某一个处理器核上,那么两个或者多个线程是可以真正同时存在,两个或多个线程能够同时运行,我们就称为并发
通俗来讲,就是多个线程同时操作相同的资源
高并发:服务器同时访问计算机资源,比如天猫淘宝这些网站,时时刻刻都在发生高并发,如果处理不当,会导致服务器发生宕机,内存溢出等异常。。。。
高并发模拟(实现一个计数功能)
使用线程池和信号量来模拟一个高并发的计数功能,对线程池和信号量不明白的自行google
package com.mmall.concurrency.example.count;
import com.mmall.concurrency.annoations.NotThreadSafe;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class CountExample1 {
//请求总数
public static int clientTotal = 5000;
//同时并发执行的线程数
public static int threadTotal = 200;
public static int count = 0;
public static void main(String[] args) throws Exception{
//定义一个线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//定义一个信号量,信号量的作用是控制线程对资源的访问
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for(int i=0;i<clientTotal;i++){
executorService.execute(()->{
try {
semaphore.acquire();
add();
semaphore.release();
}catch (Exception e){
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
System.out.println("count:"+count);
}
public static vo