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应届毕业大专生已工作一年,相信这也是大部分同届生的现状. 那么,一个萌新进入职场一年都经历了什么呢?在校那会我是挺好奇的. 这篇文章是根据自己一年 ...
随机推荐
- MySQL在cmd命令行查看端口号
在命令行输入: show global variables like 'port'; 转自:https://blog.csdn.net/zhufengy/article/details/8014778 ...
- 牛客竞赛第二场D Kth Minimum Clique 贪心+bitmap
Kth Minimum Clique 题意 给出n(n<100)个点的邻接表,和n个点的权值,求第k大的团(完全子图) 分析 n很小,并且好像没有什么算法和这个有关系,所以可以往暴力枚举的方向想 ...
- MySql 怎么存取 Emoji
01.前言 Emoji 在我们生活中真的是越来越常见了,几乎每次发消息的时候不带个 Emoji,总觉得少了点什么,似乎干巴巴的文字已经无法承载我们丰富的感情了.对于我们开发者来说,如何将 Emoji ...
- Wx-mpvue开发小程序
一.准备 安装Node 安装vue-cli ( npm install --global vue-cli ) 二.创建 初始化项目 ( vue init mpvue/mpvue-quickstart ...
- 【SIKI学院】愤怒的小鸟创建过程-2
第二讲:Spring joint组建介绍 点重小鸟右侧add component输入spring joint,选择spring joint 2D(弹簧关节).给右侧树枝加刚体选择physics 2D- ...
- 第一个vi
选择——VI 在前面板选择波形图表 在程序框图中选择while循环,框住波形图 在编程-数值中选择随机数,连接随机数与波形图 在编程-定时子选项卡中选择--等待下一个整数倍,在数值中选择常量选项,数值 ...
- Bugku-CTF分析篇-中国菜刀(国产神器)
中国菜刀 国产神器
- java基础(温故而知新)
一 数据类型 1.1 8种基本数据类型 1.2 引用数据类型 1.3 java内存机制 1.3.1 寄存器 1.3.2 栈 1.3.3 堆 1.3.4. 静态区/方法区 1.3.5. 运行时常量池(R ...
- 连接查询:inner join,left join,right join
感谢原创:https://blog.csdn.net/plg17/article/details/78758593 准备工作: 1)新建两张表a_table和b_table: create table ...
- 每天进步一点点------Altium Designer PCB设计规则中英对照
Electrical(电气规则) Clearance:安全间距规则 Short Circuit:短路规则 UnRouted Net:未布线网络规则 UnConnected Pin:未连线引脚规则 Ro ...