Java后台技术(线程安全)
前端时间一个同事因为后台线程安全问题出了一次生产事故,今天我就对线程安全问题进行一次总结。
首先,我们来大致看以下我同事写的代码,代码我进行了精简,大致如下:
for (final String receiver : getReceivers())
{
sendThreadPool.excute(new Runnable() {
public void run()
{
newMessage.setTo(receiver);
MessageProductor.sendMessage(newMessage);
}
});
}
不知道大家有没有发现什么问题,这个方法的作用时将一条消息发送给N个人,但是得到的结果却是部分人没有收到,部分人收到了两次。
相信大家也从上面的代码中发现问题了,原因是newMessae同时被多个线程修改和访问,最终导致该实体被其他线程修改。
基于此问题,我对这种多线程的建议如下:
1、线程内尽量不访问线程外的对象
对于上面的示例,建议在线程外将newMessage序列化,再作为线程参数传入线程,再在线程内反序列化。
2、如果线程内需要访问线程外的对象,建议采用线程安全类型或者加锁
对于上面的示例,可改为如下代码
private static Lock lock = new ReentrantLock();
for (final String receiver : getReceivers())
{
sendThreadPool.excute(new Runnable() {
public void run()
{
lock.lock () ;
newMessage.setTo(receiver);
MessageProductor.sendMessage(newMessage);
lock.unlock();
}
});
}
下面我来对Java中实现线程安全的方式进行下总结:
加锁
常用的锁有如下三种:
(1)synchronized 是互斥锁;
(2)ReentrantLock 顾名思义 :可重入锁
(3)ReadWriteLock :读写锁
原子类型
常用的原子类型如下:
(1)AtomicInteger和AtomicIntegerArray:基于Integer类型
(2)AtomicBoolean:基于Boolean类型
(3)AtomicLong和AtomicLongArray:基于Long类型
(4)AtomicReference和AtomicReferenceArray:基于引用类型
线程安全类
(1)Vector
(2)HashTable
(3)StringBuffer
以上几点看起来很简单,特别是StringBuffer,很多Java岗位的面试都会问道StringBuffer和StringBuilder的区别,需要大家一定记住,StringBuilder是线程安全的类。
Java后台技术(线程安全)的更多相关文章
- Java后台技术(TDDL)
从PC客户端开发转项目经理已经有一段时间了,感觉还不错,平安这边的项目经理还需要对外,所以部门其他项目经理经常需要出差去见客户,我专门对内,部门所有的开发和测试每天做什么.接下来做什么我都必须了解,部 ...
- Java后台技术(Dubbo入门)
我现在公司提供的产品是即时通讯软件,因为我从.net桌面应用开发转岗,从java后台转项目经理,让我有幸拥有了后台开发人员所有的权限,所有的后台源码和技术文档对我开放,可惜仅在后台待了3周不到,还没来 ...
- java后台技术
本文旨在梳理服务端开发技术栈,希望帮助后端开发同学更全面了解Java服务端主要涉及的知识点 1. 语言相关 1.1 Java 核心知识点 Java的类加载机制 JVM相关:JVM内存模型和结构,GC原 ...
- Java后台技术IBATIS入门
做过.net后台开发的同志一定用过Entity FrameWork,该框架实现了实体Entity到数据库行的映射,通过操作实体DataSet,就能够直接同步修改到数据库.但是Java暂时没有类似的技术 ...
- Java 后台线程介绍
一 是啥? package com.aaa.threaddemo; /* * 一 Java后台线程? * 守护线程--也称"服务线程",他是后台线程, * 它有一个特性,即为用户 ...
- Java多线程与线程池技术
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- java后台常见问题
Java后台面试 常见问题 Nginx负载均衡 轮询.轮询是默认的,每一个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉了,则能自动剔除 ip_hash.个请求按访问IP的hash结果 ...
- 一年工作经验的大专生程序员(java后台)
1.文章前言 作为18应届毕业大专生已工作一年,相信这也是大部分同届生的现状. 那么,一个萌新进入职场一年都经历了什么呢?在校那会我是挺好奇的. 这篇文章是根据自己一年 ...
随机推荐
- 三值的排序 Sorting a Three-Valued Sequence(洛谷 P1459USACO2.1,IOI96Day2)
Sorting a Three-Valued Sequence IOI'96 - Day 2 Sorting is one of the most frequently performed compu ...
- Java数组转集合之Arrays.asList()用法
Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...
- Oracle 11G在用EXP 导入、导出时,若有空表对导入导出中遇到的问题的解决
11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...
- 百炼OJ - 1005 - I Think I Need a Houseboat
题目链接:http://bailian.openjudge.cn/practice/1005/ 思路 一个半圆面积每年增长50,已知一个点坐标,求第几年点在半圆内. #include <stdi ...
- Added non-passive event listener to a scroll-blocking 'touchmove' event. Consider marking event handler as 'passive' to make the page more responsive
Vue控制台警告: Added non-passive event listener to a scroll-blocking 'touchmove' event. Consider markin ...
- Nexus坑人系列-interface Unknown state L3 Not Ready
这个情况也容易出现在新使用设备的时候,当设备上没有L3接口模块的时候,这个问题就出现了. 接下来,尤其是如果我们需要运行VPC(并且如果正在运行N5K,N7K等!),则需要在交换机上配置第3层接口. ...
- 【python】anaconda中打开IDLE(python 自带编辑器)
最近要参加蓝桥杯了,发现 python 的编辑器是使用 python 自带的 IDLE,电脑上只用 Anaconda,就来找一下 打开 .\Anaconda3\Scripts\idel.exe 打开 ...
- 【音乐欣赏】《Forget》 - The Tech Thieves
曲名:Forget 作者:The Tech Thieves [00:00.000] 作曲 : Mark Emmanuel/Alia May Plesa-Topham [00:01.000] 作词 : ...
- 每天进步一点点------altium designer 实用的快捷键
1.设计浏览器快捷键: 鼠标左击 选择鼠标位置的文档鼠标双击 编辑鼠标位置的文档鼠标右击 ...
- Java8 Lambda使用指南
Java8 Lambda 的使用指南 原文地址:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#s ...