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应届毕业大专生已工作一年,相信这也是大部分同届生的现状. 那么,一个萌新进入职场一年都经历了什么呢?在校那会我是挺好奇的. 这篇文章是根据自己一年 ...
随机推荐
- python面试的100题(9)
17.python如何实现单例模式?请写出两种实现方式? 第一种方法:使用装饰器 def singleton(cls): instances = {} def wrapper(*args, **kwa ...
- WLC5520分布式端口(数据口)使用1G模块!
思科WLC5520有两个分布式端口. 在 10G 模式和 1G 模式之间切换•如果在端口 1 上未安装任何内容,则默认情况下主板配置为 10G 模式.因此,要切换到 1G 模式,则必须在端口 1上安 ...
- flutter_html 和 WebView 解析html 和 build.gradle源码
一.flutter_html 涉及的 api 接口: http://www.phonegap100.com/appapi.php?a=getPortalArticle&aid=20 二.Flu ...
- Go网络编程UDP
package main import ( "fmt" "net" "strings" ) // UDP server func main( ...
- xv6 trapframe定义的位置
在x86.h的最下面,真是把我找吐了,MD
- Lindström–Gessel–Viennot lemma定理 行列式板子
https://blog.csdn.net/qq_37025443/article/details/86537261 博客 下面是wiki上的讲解,建议耐心地看一遍...虽然看了可能还是不懂 http ...
- vue中的回到顶部
<template> <div class="main"> <div class="content">灰色部分是内容部分&l ...
- [坑] js indexOf is not a function
今天写js的时候,本来没有问题的代码突然出现了问题,就是本来下拉框里面在更新之后会出现内容的 但是并没有出现内容,按下F12 查看了Console之后发现确实是接收到了数据,但是却也报错了 内容是 我 ...
- 【Python redis】
目录 基本用法 连接池 基本命令 String Hash List set "下载:pip install redis @ *** 基本用法 redis库提供两个类,Redis和Strict ...
- 自定义控件之绘图篇(四):canvas变换与操作
具体操作见下面链接: http://blog.csdn.net/harvic880925/article/details/39080931/