【Java基础-并发编程】-变量的线程安全分析 秒速五厘米 2023-10-12 15:32 6阅读 0赞 ## 一、变量的线程安全分析 ## ### 1.1 成员变量和静态变量是否线程安全 ### * 如果它们没有共享,则线程安全 * 如果它们被共享了,根据它们的状态是否能够改变,有份两种情况 1. 如果只有读操作,则线程安全 2. 如果有读写操作,则这段代码是临界区,需要考虑线程安全 ### 1.2 局部变量是否线程安全 ### * 局部变量是线程安全的 * 但局部变量引用的对象则未必 1. 如果该对象没有逃离方法的作用访问,他是线程安全的 2. 如果该对象逃离方法的作用范围,则需要考虑线程安全。 ### 1.3 局部变量是线程安全的 ### public static void test1(){ int i=10; //i是局部变量,线程安全的 i++; } ### 1.4 成员变量线程不安全 ### class ThreadUnsafe{ ArrayList<String> list = new ArrayList<>(); //多线程调用method1方法,ArrayList.add和ArrayList.remove的线程不安全。因为都会操作属性size, // 可能会导致add时size值未加成功,但多次remove public void method1(int loopNumber){ for (int i = 0; i < loopNumber; i++) { method2(); method3(); } } private void method2(){list.add("1");} private void method3(){list.remove(0);} } 分析: ![4b2d92b4bf694f11b497ce3d3ad79047.png][] ### 1.5 将1.4中的成员变量改成局部变量,线程安全 ### class ThreadSafe{ public void method1(int loopNumber){ ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < loopNumber; i++) { method2(list); method3(list); } } private void method2(ArrayList<String> list){list.add("1");} private void method3(ArrayList<String> list){list.remove(0);} } 分析: * list是局部变量,每个线程调用时都会创建其不同实例,没有共享 * 而method2的参数是从method1中传递过来的,与method1中引用同一个对象 ![f4f03baf6902448dbe0e3892db41f527.png][] ## 二、常见线程安全类 ## ### 2.1 常见线程安全类 ### * String * Integer * StringBuffer * Random * Vector * Hashtable * java.util.concurrent包下的类 这里说的线程安全是指:多个线程调用它们同一个实例的某一个方法时,是线程安全的。也可以理解为 * 它们的每个方法是原子的 * 但注意它们多个方法的组合不是原子的。 如下线程安全类方法的组合是线程不安全的 ![df16c619808b4828ab6677363709b084.png][] ### 2.2 不可变线程安全性 ### String、Integer等都是不可变类,因为其内部的属性不可以改变,因此它们的方法都是线程安全的。 ## 三、实例分析 ## 3.1 实例1 class MyServlet extends HttpServlet { //线程不安全 Map<String,String> map = new HashMap<>(); //线程安全 String s1="..."; //线程安全 final String s2="..."; //线程不安全 Date d1 = new Date(); //线程不安全 final Date d2 = new Date(); public void doGet(HttpServletRequest request, HttpServletResponse response){ //使用上述变量 } } 3.2 实例2 public class MyServlet extends HttpServlet { //线程不安全 private UserService userService = new UserServiceImpl(); public void doGet(HttpServletRequest request, HttpServletResponse response){ userService.update(); } } public class UserServiceImpl implements UserService{ //记录调用次数 private int count=0; public void update(){ //... count++; } } [4b2d92b4bf694f11b497ce3d3ad79047.png]: https://img-blog.csdnimg.cn/4b2d92b4bf694f11b497ce3d3ad79047.png [f4f03baf6902448dbe0e3892db41f527.png]: https://img-blog.csdnimg.cn/f4f03baf6902448dbe0e3892db41f527.png [df16c619808b4828ab6677363709b084.png]: https://img-blog.csdnimg.cn/df16c619808b4828ab6677363709b084.png
相关 Java并发编程:线程安全的代码实例分析 在Java并发编程中,线程安全的代码意味着即使多个线程同时执行,代码也能保证数据的一致性和完整性。以下是一些线程安全的代码实例: 1. **使用synchronized关键字 你的名字/ 2024年09月21日 06:00/ 0 赞/ 8 阅读
相关 Java并发编程:线程安全问题实例分析 在Java的多线程环境中,线程安全是一个关键的概念。线程安全是指一个对象在多线程环境下正确执行不会产生意外结果的状态。 以下是一些具体的线程安全问题实例: 1. **共享变 电玩女神/ 2024年09月16日 06:03/ 0 赞/ 23 阅读
相关 并发编程:Java线程安全问题分析 在Java的并发编程中,线程安全是一个重要且复杂的问题。以下是针对这一问题的一些分析: 1. **锁(Lock)**:最基础的线程同步工具,通过`java.util.conc 女爷i/ 2024年09月15日 05:15/ 0 赞/ 26 阅读
相关 并发编程:Java的线程安全问题实例分析 在Java编程中,线程安全是一个重要的概念。当多个线程同时访问和修改一个共享资源(如变量、数组或对象)时,如果处理不当,就会导致数据不一致的问题,即线程安全问题。 以下是一些 快来打我*/ 2024年09月11日 15:00/ 0 赞/ 27 阅读
相关 Java并发编程:线程安全问题案例分析 在Java并发编程中,线程安全问题主要表现为多个线程同时访问共享资源,导致数据不一致或错误。以下是一些常见的问题案例: 1. **单例模式的线程安全问题**: - 传统 落日映苍穹つ/ 2024年09月05日 13:39/ 0 赞/ 21 阅读
相关 【Java基础-并发编程】-变量的线程安全分析 一、变量的线程安全分析 1.1 成员变量和静态变量是否线程安全 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,有份两种情况 秒速五厘米/ 2023年10月12日 15:32/ 0 赞/ 7 阅读
相关 Java并发编程(二) : 线程安全问题、synchronized保证线程安全、private或final的重要性、线程八锁问题分析、变量的线程安全分析 > 承接上文: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9n 谁借莪1个温暖的怀抱¢/ 2022年12月29日 01:57/ 0 赞/ 85 阅读
相关 并发编程-线程安全 1. 什么是线程安全 在多线程访问下, 不管哪个线程调用这个类,这个类总能表现出正确的行为 JMM 引发的问题 ![在这里插入图片描述][watermark_ty ゝ一纸荒年。/ 2022年04月24日 05:28/ 0 赞/ 271 阅读
相关 并发编程-线程安全 原因:Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。线程之间的共享变量存储 ゝ一纸荒年。/ 2022年04月23日 18:36/ 0 赞/ 224 阅读
还没有评论,来说两句吧...