zoukankan      html  css  js  c++  java
  • java线程安全

    java中的线程安全是什么:
    就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
    什么叫线程安全:
    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 
    或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
    线程安全问题都是由全局变量及静态变量引起的。
    若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
    看过vector源码的同学就会知道他的许多操作都是加了synchronized修饰的比如他的添加元素。(不知道synchronized是什么意思的自行百度!)

    1
    2
    3
    public synchronized void addElement(E obj) {  modCount++;
           ensureCapacityHelper(elementCount + 1);  elementData[elementCount++] = obj;
    }

    而HashMap的所有操作都没有加synchronized修饰 ,不如他的put源码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public V put(K key, V value) {
         if (key == null)
             return
          putForNullKey(value);
          int hash = hash(key.hashCode());
          int i = indexFor(hash, table.length);
          for(Entry<K,V> e = table[i]; e != null; e = e.next) {
             Object k;
             if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
                 V oldValue = e.value;
                 e.value = value;
                 e.recordAccess(this);
                 return
                 oldValue;    }
         }
         modCount++;
         addEntry(hash, key, value, i);
         return null;
     }

    再看看ArrayList的add方法的源码

    1
    2
    3
    4
    5
    public boolean add(E e) {
         ensureCapacity(size + 1);  // Increments modCount!!
         elementData[size++] = e;
         return true;
     }

    再看StringBuffer的append源码,他是有synchronized修饰的

    1
    2
    3
    4
    5
    public synchronized
      StringBuffer append(String str) {
         super.append(str);
         return this;
     }

    最后是Properties的setProperty方法,他是有synchronized修饰的

    1
    2
    3
    4
    5
    public synchronized
      Object setProperty(String key, String value) {
          return
          put(key, value);
     }

    由此就可以判断出谁是线程安全的了。

  • 相关阅读:
    WPF在XAML的资源中定义空字符串String.Empty
    WPF中定义TabItem的可选区域(特别是当使用Label来呈现Header时)
    反转ListBox的ListBoxItem(控件级别,不是数据的反转)
    WPF获取相对位置、坐标的方法
    WPF为ItemsControl设置ItemsPanelTemplate
    WPF中List的Add()与Insert()方法的区别
    返回表达式列表中最小值least(exp1,exp2,exp3,……,expn)
    oracle_基本SQL语言
    JS 实现的浏览器系统通知 iNotify.js
    RHCE认证考前辅导
  • 原文地址:https://www.cnblogs.com/zkk-wust/p/7299485.html
Copyright © 2011-2022 走看看