java 多线程踩过的坑
多线程踩坑记录:
1、多线程切记不可以同时操作同一个原子数据。解释:存在一个条数据库A数据,不可以在2个或2个以上的线程中同时操作A数据。会引发重复操作。
2、多线程操作方法不要加synchronized同步关键字,这失去了多线程的意义。解释:会是多线程按照同步线程执行。
3、调用第三方接口时尽量不要使用多线程。解释:因为你不知道第三方接口是否针对高并发作了处理。如果第三方接口没有针对高并发作处理,自己写的多线程逻辑也没有处理好,会导致重复操作成功。后果很难处理。
总结:
作为一只菜鸟遇到过的问题。给自己提醒下。
处理一批数据的多线程方法:
使用同步线程获取批量数据,在逻辑上将这批数据分成不同部分,每一部分使用多线程处理。这样可以避免多个线程同时操作统一个数据。
多线程的实例synchronized对比:
线程执行方法:
import threads.TaskRunnable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ThreadsMain {
public static void main(String[] args) {
//创建线程池对象 参数5,代表有5个线程的线程池
ExecutorService service = Executors.newFixedThreadPool(5);
//创建Runnable线程任务对象
TaskRunnable task = new TaskRunnable();
//从线程池中获取线程对象
service.submit(task);
System.out.println("----------------------");
//再获取一个线程对象
service.submit(task);
//关闭线程池
service.shutdown();
}
}
带有synchronized的执行方法:
public class TaskRunnable implements Runnable{
@Override
public synchronized void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("自定义线程任务在执行"+i);
}
}
}
执行结果:
----------------------
自定义线程任务在执行0
自定义线程任务在执行1
自定义线程任务在执行2
自定义线程任务在执行3
自定义线程任务在执行4
自定义线程任务在执行5
自定义线程任务在执行6
自定义线程任务在执行7
自定义线程任务在执行8
自定义线程任务在执行9
自定义线程任务在执行0
自定义线程任务在执行1
自定义线程任务在执行2
自定义线程任务在执行3
自定义线程任务在执行4
自定义线程任务在执行5
自定义线程任务在执行6
自定义线程任务在执行7
自定义线程任务在执行8
自定义线程任务在执行9
Process finished with exit code 0
没有synchronized的执行方法:
public class TaskRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("自定义线程任务在执行"+i);
}
}
}
执行结果:
----------------------
自定义线程任务在执行0
自定义线程任务在执行0
自定义线程任务在执行1
自定义线程任务在执行1
自定义线程任务在执行2
自定义线程任务在执行2
自定义线程任务在执行3
自定义线程任务在执行3
自定义线程任务在执行4
自定义线程任务在执行4
自定义线程任务在执行5
自定义线程任务在执行5
自定义线程任务在执行6
自定义线程任务在执行6
自定义线程任务在执行7
自定义线程任务在执行7
自定义线程任务在执行8
自定义线程任务在执行8
自定义线程任务在执行9
自定义线程任务在执行9
Process finished with exit code 0
对比结论:
加入synchronized执行结果会跟同步方法相似。就失去了多线程的意义
java 多线程踩过的坑的更多相关文章
- java多线程 ThreadPoolExecutor 策略的坑
无论是使用jdk的线程池ThreadPoolExecutor 还是spring的线程池ThreadPoolTaskExecutor 都会使用到一个阻塞队列来进行存储线程任务. 当线程不够用时,则将后续 ...
- linux下多线程踩过的坑(不定更新)
1,多线程下整个进程的退出 <<APUE>>关于进程环境一章中指出了进程退出的8个条件: ... (4)最后一个线程从启动例程中返回 (5)最后一个线程调用pthread_ex ...
- 踩过无数坑实现的哈夫曼压缩(JAVA)
最近可能又是闲着没事干了,就想做点东西,想着还没用JAVA弄过数据结构,之前搞过算法,就试着写写哈夫曼压缩了. 本以为半天就能写出来,结果,踩了无数坑,花了整整两天时间!!orz...不过这次踩坑,算 ...
- Java日期处理易踩的十个坑
前言 整理了Java日期处理的十个坑,希望对大家有帮助. 一.用Calendar设置时间的坑 反例: Calendar c = Calendar.getInstance(); c.set(Calend ...
- Java面试中遇到的坑【填坑篇】
看到大家对上篇<Java面试中遇到的坑>一文表现出强力的关注度,说明大家确实在面试中遇到了类似的难题.大家在文章留言处积极留言探讨面试中遇到的问题,其中几位同学还提出了自己的见解,我感到非 ...
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- Java多线程编程详解
转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...
- "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- 50个Java多线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...
随机推荐
- [译]GLUT教程 - 游戏模式
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...
- 最实用windows 下python+numpy安装(转载)
最实用windows 下python+numpy安装 如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间. 希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+numpy ...
- 几种session存储方式比较
原文: http://blog.sina.com.cn/s/blog_495697e6010143tj.html 集群中session安全和同步是个最大的问题,下面是我收集到的几种session同步的 ...
- JQuery+Json 省市区三级联动
一.画面以及JS <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content=&qu ...
- LR测试HTTPS
从浏览器里导出cer证书 保存好后, 下载openssl-1.0.1s安装好openssl之后,进入openssl目录: 输入openssl命令,即进入命令模式: 先将要转换的cer证书也放到open ...
- Myecplise Tomcat 启动很慢
今天突然遇到一个问题,tomcat在Myecplse启动非常慢,直接用tomcat自带的start.bat启动很快,如果通过Myeclipse启动会发现项目一直在实例化,最后发现是因为加了断点调试,断 ...
- 【CodeM初赛B轮】F 期望DP
[CodeM初赛B轮]F 题目大意:有n个景点,m条无向边,经过每条边的时间需要的时间是li,在第i个景点游览花费的时间是ti,游览完第i个景点可以获得的满意度是hi.你的总时间为k,起初你等概率的选 ...
- Sumdiv(较难数学题)
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20971 Accepted: 5290 Description Cons ...
- EF之POCO应用系列3——延迟加载
EF之POCO应用系列4——延迟加载 当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下 ...
- Eclipse 查看第三方jar包文件源代码解决方法
1.打开第三方依赖包,源文件的快捷键:ctrl + mouseClick 2.由于我们下载的第三方jar 包,如Spring等相关的依赖包时,并没有附加下载相应的源文件,所以经常出现如图的这种问题. ...