![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 50
timchen525
学而不思则罔,思而不学则殆!
展开
-
写一个并发编程的代码,保证该代码只能执行一次
错误的例子:@ThreadSafe@Slf4jpublic class AtomicExample6 { // 总的请求个数 public static final int requestTotal = 1000; // 同一时刻最大的并发线程的个数 public static final int concurrentThreadNum = 20; ...原创 2018-05-22 22:04:02 · 1715 阅读 · 0 评论 -
再谈StringBuilder和StringBuffer的区别
通常字符串的拼接我们可能会用加号"+"拼接,或者用StringBuilder、StringBuffer进行拼接。已经知道加号"+"拼接的字符串可能会创建多个对象(注意:我用的是可能,因为在一两个的拼接时候,jdk编译器会帮我们优化,而没有创建多个对象,不过,对于for循环里面的字符串拼接,推荐用StringBuilder或者StringBuffer)。区别:StringBuilder是线程不安全的...原创 2018-06-12 23:45:27 · 187 阅读 · 0 评论 -
日期工具:非线程安全SimpleDateFormat 和线程安全JodaTime(推荐)
1、SimpleDateFormat不是线程安全的对象举个栗子:@Slf4jpublic class DateFormatExample1 { private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); // 请求总数 public static i...原创 2018-06-12 23:43:20 · 1620 阅读 · 0 评论 -
Spring Boot异步线程池及异步编程
线程池中的两个概念:线程和任务,任务是需要线程去执行的。这里写一个支付相关的异步线程池的栗子:1、在application.properties中添加线程池的配置参数:# 支付相关的配置pay.threadNamePrefix=pay-exec-pay.maxPoolSize=20pay.corePoolSize=10pay.queueCapacity=10002、基于注解进行参数的配置在...原创 2018-06-12 22:32:38 · 3948 阅读 · 0 评论 -
并发的优势与风险
1、优势:(1)速度:同时处理多个请求,响应更快;复杂的操作可以分成多个进程(或线程)同时进行(2)设计:程序设计在某些情况下更简单,也可以有更多的选择(3)资源利用:CPU能够等待IO的时候能够做一些其他的事情2、风险:(1)安全性:多个线程共享数据时可能会产生于期望不相符的结果(2)活跃性:某个操作无法继续进行下去时,就会发生活跃性问题。比如:死锁、饥饿等问题。(3)性能:线程过多时会使得:C...原创 2018-05-24 22:05:44 · 964 阅读 · 0 评论 -
线程安全性-有序性
有序性:Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的运行,却会影响到多线程并发执行的正确性。Java中保证有序性:volatile、synchronized、Lock有序性-happens-before原则1)程序次序原则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作2)锁定规则:一个unlock操作先行发生于后面对于同一个锁...原创 2018-05-24 22:02:42 · 266 阅读 · 0 评论 -
volatile具体使用场景
volatile特别适合于状态标记量举个栗子:volatile boolean inited = false;// 线程1context = loadContext();inited = true;// 线程2while(!inited) { sleep();}doSomethingWithConfig(context);分析:上面的代码利用volatile修饰的init...原创 2018-05-24 22:01:44 · 2254 阅读 · 0 评论 -
共享变量在线程中的可见性问题分析
导致共享变量在线程间不可见的原因:1)线程交叉执行2)重排序结合线程交叉执行3)共享变量更新后的值没有在工作内存与主存间及时更新可见性-synchronizedJVM中关于synchronized的两条规定:1)线程解锁前,必须把共享变量的最新值刷到主内存2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁和解...原创 2020-02-07 19:47:43 · 3044 阅读 · 0 评论 -
原子性-synchronized 修饰的四种方式
原子性-synchronized(依赖JVM)1)修饰代码块:大括号括起来的代码,作用于调用的对象比如:public void test1(int j) { synchronized (this) { // 作用的范围是大括号括起来的范围,作用的对象是调用的对象 for (int i = 0; i< 10; i++) { log.info("...原创 2018-05-24 21:56:13 · 672 阅读 · 0 评论 -
单例模式讨论
在之前的博文中曾经介绍过单例模式:https://blog.csdn.net/timchen525/article/details/78244101这里重新讨论们下单例模式,并且引入了一个基于枚举的单例模式。分析如下代码:** * 懒汉模式 */public class SingletonExample { // 私有构造函数 private SingletonExampl...原创 2018-05-28 22:54:30 · 140 阅读 · 0 评论 -
写一个并发计数器
首先给出一个并发场景下,错误的计数器方法:public class CountExample { // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程数 public static int threadTotal = 200; public static int count = 0; ...原创 2018-05-22 23:10:56 · 1359 阅读 · 0 评论 -
Java 内存模型-同步八种操作
(1)lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态(2)unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定(3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用(4)load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存...原创 2018-05-22 22:08:04 · 1685 阅读 · 3 评论 -
Java代码模拟并发请求对接口进行压测
案例:编写一段代码,模拟并发请求为20,且总的请求数为1000,当1000个请求完成之后,打印“请求完成”。实现代码:/** * 目标:编写一段代码,模拟并发请求为20,且总的请求数为1000,当1000个请求完成后,打印“请求完成” */@Slf4jpublic class TestConcurrentRequest { // 总的请求个数 public static ...原创 2018-05-18 21:40:45 · 10625 阅读 · 0 评论 -
关于AtomicInteger的实现原理
首先给出一个并发编程时,对于计数器进行累加时有问题的程序:public class CountExample1 { // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程数 public static int threadTotal = 200; public static int count ...原创 2018-05-18 21:38:49 · 894 阅读 · 0 评论 -
ThreadLocal在实际项目中的应用
首先,分析下ThreadLocal的源码:在分析ThreadLocal的具体用法前,我们来看下ThreadLocal对外提供的三个方法(set、get、delete)的源码:1)set方法 设置变量public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t);...原创 2018-06-07 00:17:52 · 3881 阅读 · 1 评论