• 线程安全与共享资源


    转自:

    线程安全与共享资源

    我们将一段代码允许多个线程同时运行,并都会按照预期展现效果,我们将这段代码称之为“线程安全
    一个线程安全的代码,不应该包含"竞态条件",静态避免在线程中出现共享变量

    局部变量

    我们将存储在线程自己中的栈数据称之为“局部变量”
    在java中,局部变量永远不会被多个线程共享

    public void someMethod(){
      long threadSafeInt = 0;
      threadSafeInt++;
    }
    

    局部的对象引用

    对象的局部引用和基础类型的局部变量有一些不同
    虽然引用本身没有被共享,但是引用所指的对象并没有存储在线程的栈内
    所有的对象都存在共享堆中
    如果一个方法创建的对象不会被其它方法获取,则此方法可认为是一个线程安全
    例:

    public void someMethod(){ 
      LocalObject localObject = new LocalObject();
      localObject.callMethod();
      method2(localObject);
    }
    
    public void method2(LocalObject localObject){
      localObject.setValue("value");
    }
    

    上述代码中LocalObject对象没有被方法返回,也没有被传递给someMethod()方法外的对象。每个执行someMethod()的线程都会创建自己的LocalObject对象,并赋值给localObject引用
    所以在此处LocalObject是线程安全的
    即:整个someMethod()都是线程安全的

    对象成员

    对象成员存储在堆上, 当多个线程同时更新同一个对象的同一个成员,此时则是线程不安全代码 public class NotThreadSafe{ StringBuilder builder = new StringBuilder(); public add(String text){ this.builder.append(text); } } //当两个线程同时调用同一个NotThreadSafe实例上的add()方法,经会存在this.builder的共享访问 NotThreadSafe sharedInstance = new NotThreadSafe(); new Thread(new MyRunnable(sharedInstance)).start(); new Thread(new MyRunnable(sharedInstance)).start(); public class MyRunnable implements Runnable{ NotThreadSafe instance = null; public MyRunnable(NotThreadSafe instance){ this.instance = instance; } public void run(){ this.instance.add("java265.com"); } } //当两个MyRunnable共享了同一个NotThreadSafe对象,运行add()方法时会造成竞争共享资源的访问

    线程安全概述:
       当一个资源的创建,使用,销毁都在同一个线程内完成,并且不会逃离该线程的控制,我们将这类代码称之为“线程安全”
  • 相关阅读:
    DADPS-生物素-炔基_CAS:2241685-22-1试剂反应原理
    C#创建ini文件写入并读取
    使用VBA快速完成不规则数据整理
    进程控制以及相关原语的使用(创建,终止,阻塞,唤醒,切换)
    Django自定义manage.py命令实现hexo博客迁移
    Js与Jq实战:第十讲:jQuery制作动画
    std::c++ 中格式化任意字符串
    8.3.6 修改字段的位置
    Java-反射:实现map自动封装进实体类中 理解springmvc 参数封装底层原理
    java计算机毕业设计springboot+vue+elementUI永加乡精准扶贫信息管理系统
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/126654517