java多线程高并发
旭日Follow_24 的CSDN 博客 ,全文地址请点击:
https://blog.csdn.net/xuri24/article/details/81293321
“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程
多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现
一,高并发与多线程
1,高并发:高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。高并发想让服务器(tomcat)能接受处理多用户多请求。
2,多线程:多线程只是为了达到高并发目的(首先得有多线程接收处理多任务,才有高并发发生)。在某个细节点上,为实现某并发功能而采用的一种具体的实现方法,这种功能也可以由多进程实现,
当然,也可以由多进程,多线程一起实现。这是战术上的并行。
总之:高并发是一种现象,多线程是一种Java提高性能的手段
其实就是用CountDownLatch来使多个线程同时运行,同时发送请求,虽然post的事件不能保证同时,但发post能保证同时(相差0.2毫秒),通过这种方法,测试了redis的setkey,getkey来保证不重复数据的时间阈值在几百纳秒,再短就算redis也无能为力了,所以多线程虽然快,但是没锁,还是不太安全。。
@Service
public class TestConcurrentService {
@Autowired
private ApiHttpClientService apiHttpClientService;
private static final Logger logger = Logger.getLogger(TestConcurrentService.class);
public void testConcurrent1(String sign) {
ExecutorService exec = Executors.newFixedThreadPool(3);
CountDownLatch begin = new CountDownLatch(1);
CountDownLatch end = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
exec.execute(new HttpRequestUtils(begin, end, sign));
}
begin.countDown();
try {
end.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
exec.shutdown();
logger.info("main method end");
}
public class HttpRequestUtils implements Runnable {
private Logger log = Logger.getLogger(HttpRequestUtils.class);
private CountDownLatch begin;
private CountDownLatch end;
private String sign;
private String url = "http://localhost:8080/score/private/v1/injectsg";
public HttpRequestUtils(CountDownLatch begin, CountDownLatch end, String sign) {
this.begin = begin;
this.end = end;
this.sign = sign;
}
@Override
public void run() {
try {
begin.await();
Map<String, String> header = new HashMap<>();
header.put("Content-Type", "application/json");
header.put("sign", sign);
ScoreRequestBean bean = new ScoreRequestBean();
Data data = new Data();
data.setRemark("单发测试");
data.setExtId("ext111111519");
data.setPartnerMemberId(297);
data.setPoints(1);
bean.setData(data);
bean.setEventId("123asdasd");
System.out.println("线程" + Thread.currentThread().getName() +
"已接受命令," + "时间为:" + System.nanoTime() + "|" + System.nanoTime() / 1000000L);
apiHttpClientService.post(url, null, header, bean, ResultConstant.class);
System.out.println("线程" + Thread.currentThread().getName() +
"命令已结束");
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
end.countDown();
}
}
}
}
java多线程高并发的更多相关文章
- Java 多线程高并发编程 笔记(一)
本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍Re ...
- Java多线程高并发学习笔记(一)——Thread&Runnable
进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的 ...
- Java多线程高并发学习笔记——阻塞队列
在探讨可重入锁之后,接下来学习阻塞队列,这边篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...
- Java 多线程高并发编程 笔记(二)
1. 单例模式(在内存之中永远只有一个对象) 1.1 多线程安全单例模式——不使用同步锁 public class Singleton { private static Singleton sin=n ...
- java多线程高并发知识总结
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- java多线程高并发的学习
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作, ...
- JAVA多线程---高并发程序设计
先行发生原则 程序顺序原则:一个线程内保证语义的串行性 volatile:volatile变量的写,先发生于读,这保证了volatile变量的可见性 锁规则:解锁必然发生在随后的加锁前 传递性:A优先 ...
随机推荐
- Must Know Tips/Tricks in Deep Neural Networks
Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei) Deep Neural Networks, especially C ...
- spring mvc jsonp调用示例
服务端代码:主要是返回的时候,返回值要用callback包装一下 /** * JSONP调用 * * @param request * @return */ @RequestMapping(" ...
- map put值 使用匿名函数
List<Map<String, Object>> list = setRoleMenuRlMapper.selectMapByParams(params); // Map m ...
- Android WebView 打印 Console Log
通常状况下,添加如下代码即可: mWebView.setWebViewClient(new WebChromeClient { /*android 低版本 Desperate*/ @ ...
- Javascript高级编程学习笔记(82)—— 富文本操作(2)
操作富文本 与富文本编辑器的交互的主要方式就是使用 document.execCommand() 方法 该方法可以对文档执行自定义命令,并且可以应用大多数格式 该方法接收三个参数: 要执行命令的名称 ...
- Eclipse 修改自动补全触发器只能输入四个字符为多个字符
如果eclipse中的[auto activation triggers for java]自动补全触发器这个位置的文本框有时候只能输入4个字符, 可以通过修改配置文件的方法实现,具体操作步骤如下: ...
- Core 读取配置文件
新建控制台 static void Main(string[] args) { Console.WriteLine("Hello World!"); //获取应用程序的当前工作目录 ...
- python 安装 reportlab 报错 “ImportError: No module named reportlab.lib”
reportlab是什么? 是一个处理PDF和画图的python开源库. 初次安装: pip install reportlab 重新安装: pip install --upgrade --force ...
- 微信小程序开发-第一弹
前言: 本篇文章为大家详细介绍微信小程序开发第一篇,后续步骤会逐步更新,欢迎大家关注. 第一步 注册 1.1 打开网址 https://mp.weixin.qq.com/ ...
- springboot项目部署云服务器
Springboot项目部署云服务器 springboot项目部署云服务器还是挺简单的 首先你要有java运行环境,就是jdk的安装,如果还没有装没有参考安装:阿里云ECS建网站(建站)超详细全套完整 ...