#Java线程安全问题
在平时编程中,我们会经常用到多线程,尤其是android中,但多线程也特别容易带来问题,比如线程冲突、死锁等问题,为了加深理解,我们先来回顾一下线程冲突问题。
##线程冲突
```java
public class UserStat {int userCount;public int getUserCount() {return userCount;}public void increment() {userCount++;}public void decrement() {userCount--;}
}
```
假设当一个线程正在递增**userCount**变量时,另一个线程则试图通过调用**getUserCount**来读取该变量的值,这时会发生什么情况呢?请记住,**userCount++**语句实际上是由3个连续的步骤组成的:  - 读取**userCount**的值,并将它保存在某个临时储存装置中
- 递增这个值
- 降递增的值写回到**userCount**中假设有一个线程负责读取和递增**userCount**的值。在它有机会存储递增的值之前,另一个线程会读取它,并且得到的是旧值。当第二个线程最终得到机会写入**userCount**时,它会替换掉第一个线程的递增值。两个非原子的操作在不同的线程中运行,却操作同一个数据,其中的交叉就称作线程冲突。
##不安全的线程例子
下面我们从一个不安全的例子开始,分析一下线程冲突。
```java
public class UnSafeThreadDemo {public UnSafeThreadDemo() {}/*** @author xuyan*/public static void main(String[] args) throws InterruptedException {final UserStat us = new UnSafeThreadDemo().new UserStat();Thread th1 = new Thread("th1") {@Overridepublic void run() {System.out.println(us.getUserCount() + " " + super.getName());}};Thread th2 = new Thread("th2") {@Overridepublic void run() {System.out.println(us.getUserCount() + " " + super.getName());}};th1.start();// Thread.sleep(100);th2.start();}class UserStat {int userCount;public int getUserCount() {return userCount++;}}
}```
- 如果不执行Thread.sleep(1000);
- 偶尔结果为:
- 0 th2
- 0 th1
- 如果执行Thread.sleep(1000);
- 结果为:
- 0 th1
- 1 th2  对于这样的多线程冲突问题,我们采用一种常规的解决方法,就是同步机制。让我们对操作加synchronized关键字:```java
class UserStat {int userCount;public synchronized int getUserCount() {return userCount++;}
}
```注:synchronized 方法控制对类成员变量的访问: 每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属 线程阻塞 ,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可 执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

转载于:https://www.cnblogs.com/sdxy/p/3341475.html

java线程冲突问题——不安全的线程例子相关推荐

  1. java queue 线程安全_java并发编程之线程安全方法

    线程安全的实现方法,包含如下方式 一, 互斥同步 使用互斥锁的方式. 举个栗子 synchronized,最常用的同步实现方案, ReentrantLock,java并发包中工具,后续介绍. 互斥同步 ...

  2. java同步关键词解释、synchronized、线程锁(Lock)

    1.java同步关键词解释 21.1 synchronized synchronized是用来实现线程同步的!!! 加同步格式: synchronized( 需要一个任意的对象(锁) ){ 代码块中放 ...

  3. servlet:共享资源造成的线程冲突

    一,由于servlet是单实例的类,在每个新客户端访问时创建一个新的线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问 ...

  4. Java 编程问题:十、并发-线程池、可调用对象和同步器

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 并发的 ...

  5. java servlet 多线程_Servlet的多线程和线程安全

    线程安全 首先说明一下对线程安全的讨论,哪种情况我们可以称作线程安全? 网上对线程安全有很多描述,我比较喜欢<Java并发编程实战>给出的定义,"当多个线程访问某个类时,不管运行 ...

  6. java线程池的工作原理_Java 线程池的介绍以及工作原理

    在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2. 提高响应速度 ...

  7. Java多线程001——一图读懂线程与进程

    本博客 猫叔的博客,转载请申明出处 前言 本系列将由浅入深,学习Java并发多线程. 一图读懂线程与进程 1.一个进程可以包含一个或多个线程.(其实你经常听到"多线程",没有听过& ...

  8. 【Java并发编程】面试必备之线程池

    什么是线程池 是一种基于池化思想管理线程的工具.池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需.比如我们的对象池,数据库连接池等. 线程池好处 我们为什么要使用线程池,直接new ...

  9. java 线程的创建和执行_线程管理(一)线程的创建和运行

    声明:本文是< Java 7 Concurrency Cookbook>的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:欧振聪 线程的创建和运行 ...

  10. Java基础学习总结(17)——线程

    2019独角兽企业重金招聘Python工程师标准>>> 一.线程的基本概念 线程理解:线程是一个程序里面不同的执行路径 每一个分支都叫做一个线程,main()叫做主分支,也叫主线程. ...

最新文章

  1. 拒绝接口裸奔!开放API接口签名验证!
  2. python怎么导入视频-python 给视频添加马赛克
  3. Py之minepy:minepy的简介、安装、使用方法之详细攻略
  4. 【必看】运维是“越老越吃香“的职业?
  5. linux 查看开放的端口_如何在 Linux 中查看正在使用的端口
  6. html股票数据代码,股票数据的网站抓取(4.2)代码优化
  7. python绘制散点图的步骤_python如何绘制散点图?
  8. 多标签分类_多标签分类文献阅读(8)
  9. Asp.net Request方法获取客户端的信息
  10. python内置函数可以返回列表元组_十九、python内置函数汇总
  11. JAVA 基础之 多线程
  12. 概率论与数理统计(陈希孺)笔记2.1
  13. VC与matlab混合编程
  14. 谷歌浏览器下载、安装、配置。(保姆级详细教程。)
  15. three.js 05-06 之 CylinderGeometry 几何体
  16. Java实现发送短信
  17. jQuery中关于jQuery.fn.init.prototype = jQuery.fn的解读
  18. contest13 CF197div2 oooxx ooooo ooooo
  19. 基于入侵杂草和花授粉混合算法的WSN节点部署优化
  20. 树莓派4b搭建个人云_用树莓派搭建私人简易网盘 2/5 树莓派4B初始设置

热门文章

  1. 【汇编语言】通用数据处理指令——算术运算类指令
  2. mysql 事务操作入门
  3. InnoDB如何实现多版本
  4. 内存表与 InnoDB表对比
  5. Nginx如何实现读写限流的方法
  6. Linux用户、群组及权限
  7. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 之 (三)Nginx负载均衡配置...
  8. Linux下安装DB2_v9.7详细教程
  9. 高并发高流量网站架构[转]
  10. dcopserver出错解决办法