非线程安全问题
来源:互联网 发布:unity3d meshrenderer 编辑:程序博客网 时间:2024/05/16 10:17
非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。
比如两个账号同时登陆的情况:
例子说明:
一个非线程安全环境:
package com.zxc.thread.test;public class LoginTest {private static String usernameRef;private static String passwordRef;public static void doPost(String username,String password){usernameRef = username;try {if(username.equals("a")){Thread.sleep(5000);}passwordRef = password;System.out.println("username=" + usernameRef + " password=" + passwordRef);} catch (InterruptedException e) {e.printStackTrace();}}}线程ALogin.java代码如下:
package com.zxc.thread.test;public class ALogin extends Thread{@Overridepublic void run(){LoginTest.doPost("a", "aa");}}线程BLogin.java代码如下:
package com.zxc.thread.test;public class BLogin extends Thread {@Overridepublic void run(){LoginTest.doPost("b", "bb");}}运行类Run.java代码如下:
package com.zxc.thread.test;public class Run {public static void main(String[] args) {ALogin a = new ALogin();a.start();BLogin b = new BLogin();b.start();}}运行结果:
username=b password=bbusername=b password=aa这个就是非线程安全的体现,要解决这个问题,可以使用synchronizsd关键字,synchronized可以在任意对象及方法上加锁,而加锁的这段代码成为“互斥区”或“临界区”,当一个线程想要执行同步方法里面的代码时,线程首先尝试去拿这把锁,如果能够拿到这把锁,那么这个线程就可以执行synchronized里面的代码,如果拿不到,这个线程就会不断地尝试拿这把锁,直到能够拿到为止,而且是有多个线程同时去争抢这把锁。
修改LoginTest.java代码:
public class LoginTest {private static String usernameRef;private static String passwordRef;synchronized public static void doPost(String username,String password){usernameRef = username;try {if(username.equals("a")){Thread.sleep(5000);}passwordRef = password;System.out.println("username=" + usernameRef + " password=" + passwordRef);} catch (InterruptedException e) {e.printStackTrace();}}}运行结果:
username=a password=aausername=b password=bb
1 0
- 非线程安全问题
- simpledateformat非线程安全问题
- 力所能及之java线程安全和非线程安全问题
- hashMap非线程安全问题和concurrenthashmap线程安全的比较
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- 线程安全问题
- java 判断单链表是否有环
- 在Linux中实现一个进度条程序
- iOS开发Archive报错Build Failed不显示打包界面
- mysql数据导入到hive遇到的问题
- [大型网站优化技术] -- 减少HTTP请求之合并图片详解
- 非线程安全问题
- Tomcat启动过程原理详解
- react handleClick
- Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
- 3.Django入门:教程-模型
- Web高性能开发总结
- 数据库Sharding的基本思想和切分策略
- 剑指offer-面试题2-实现singleton模式
- 一像素进程保活