非线程安全。非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。下面用一个示例来学习一下如何解决非线程安全问题。

本案例模拟了多线程下的用户登录验证功能。首先编写一个类实现验证功能, LoginCheck 类的代码如下:

public class LoginCheck
{private static String username; private static String password; public static void doPost(String _username,String _password){ try{ username=_username; if (username.equals("admin")){ Thread.sleep(5000); } password=_password; System.out.println("username="+username+"password="+password); }catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace(); } }

接下来创建线程类 LoginThreadA 和 LoginThreadB,这两个线程都调用 LoginCheck 类进行登录信息。其中 LoginThreadA 类的代码如下:

public class LoginThreadA extends Thread
{public void run(){ LoginCheck.doPost("admin","admin"); }
}

LoginThreadB 类的代码如下:

public class LoginThreadB extends Thread
{ public void run(){ LoginCheck.doPost("root","root"); }
}

现在编写主线程程序,分别创建 LoginThreadA 线程实例和 LoginThreadB 线程实现,然后启动这两个线程。主线程的代码如下:

public class Test
{public static void main(String[] args){LoginThreadA a=new LoginThreadA();a.run();    //启动线程LoginThreadALoginThreadB b=new LoginThreadB();b.run();    //启动线程LoginThreadB}
}

程序运行后的结果如下所示:

username=root password=admin
username=root password=root

从运行结果中可以看到用户名 root 出现了这两次,这是由于多个线程同时修改 username,导致值不一致的情况。

仔细查看代码可以发现问题出现在两个线程都会调用 doPost() 方法上。解决这个非线程安全问题的方法是使用 synchronized 关键字修饰 doPost() 方法即不允许多个线程同时修改 doPost() 方法中的变量。更改代码如下:

public class LoginCheck
{private static String username; private static String password; synchronized public static void doPost(String _username,String _password){ try{ username=_username; if (username.equals("admin")){ Thread.sleep(5000); } password=_password; System.out.println("username="+username+"password="+password); }catch (InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace(); } }
}

再次运行主线程,此时将看到如下所示的结果,说明不存在“非线程安全”问题了。

username=admin password=admin
username=root password=root

Java非线程安全问题的解决方法相关推荐

  1. Python线程安全问题及解决方法

    Python线程安全问题及解决方法 Python多线程是通过threading模块来实现的. 参考: https://mp.csdn.net/postedit/91069618 一.多线程共享全局变量 ...

  2. 线程安全问题及解决方法

    一.线程不安全的原因 线程在执行的过程中出现错误的主要原因有以下几种: 1.根本原因 导致线程不安全的所有原因中,最根本的原因是--抢占式执行.因为CPU字在进行线程调度的时候,是随机调度的,而且这是 ...

  3. java中线程死锁的解决方法_Java线程死锁实例及解决方法

    这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.死锁的定义 所谓死锁是指多个线程因竞争资源而造成 ...

  4. java多线程安全解决方案_《Java多线程编程核心技术(第2版)》 —1.2.8 实例变量共享造成的非线程安全问题与解决方案...

    1.2.8 实例变量共享造成的非线程安全问题与解决方案 自定义线程类中的实例变量针对其他线程可以有共享与不共享之分,这在多个线程之间交互时是很重要的技术点. 1.不共享数据的情况 不共享数据的情况如图 ...

  5. Java多线程——线程安全问题

    一.什么情况下会产生线程安全问题? 同时满足以下两个条件时: 1,多个线程在操作共享的数据. 2,操作共享数据的线程代码有多条. 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会 ...

  6. Java之线程安全问题浅析

    在java开发中确保线程安全已成为基本要求,线程安全就是指某段代码在多线程环境下能够正确的执行,不会出现数据不一致的情况,反之就是非线程安全. 目前解决线程安全的方式有: 线程安全类,如AtomicI ...

  7. 断开的管道 java.io.IOException: Broken pipe 解决方法

    断开的管道 java.io.IOException: Broken pipe 解决方法 一.Broken pipe产生原因分析 1.当访问某个服务突然服务器挂了,就会产生Broken pipe; 2. ...

  8. HashMap线程安全问题以及处理方法!

    一:HashMap为什么会有线程安全问题? 我们知道jdk1.7和jdk1.8中HashMap都是线程不安全的,那就具体讲一下为什么会线程不安全(两个方面). ①调用put方法 假如有两个线程A和B, ...

  9. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 参考文章: (1)Java ConcurrentModificationException异常原因和解决方法 ...

最新文章

  1. Scanpy(一)AnnData数据结构与一些API用法介绍
  2. 如何使用XenServer使用本地ISO镜像
  3. .NET中的加密算法总结(自定义加密Helper类续)
  4. 一个简单servlet程序
  5. sql另一个安装程序实例已在运行_SQL 经典实例
  6. *由易到难的讲解动态规划(精)
  7. php mysql while循环,PHP_MySQL教程-第二天while循环与数据库操作第2/2页
  8. [iOS]自定义view使用xib
  9. IE代理服务器出错导致浏览器无法上网
  10. Aerospike 使用场景
  11. SSIM(structural similarity index) ---图像质量评价指标之结构相似性
  12. 小白刷LeeCode(算法篇)7
  13. 大华监控服务器状态变更,大华监控存储设置教程
  14. rk3568安卓11系统之开发环境搭建
  15. Linux基本命令的使用(2)
  16. CST微波工作室边界条件和背景材料
  17. 计算机 教案,计算机教案.doc
  18. flume分布式日志收集系统操作
  19. tp6 富文本编辑器
  20. 360的流量监控还是不错的,

热门文章

  1. Matlab:Matlab中常用的函数、案例详细攻略
  2. MySQL索引面试题分析(索引分析,典型题目案例)
  3. 腾讯云 视频 点播 视频上传接口
  4. [嵌入式]Bootloader的作用
  5. C语言中函数可变参数解析
  6. stm8s开发(六) EXIT的使用:做一个外部中断的按钮!
  7. ST17H26上下拉电阻设置注意事项
  8. MATLAB之相关函数
  9. 解决关于 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it....报错
  10. 18-Chain of trust bindings