Java中的多線程

jopen 8年前發布 | 10K 次閱讀 Java開發

經常聽到StringBuffer是線程安全的,String是線程不安全的,可是什么是線程安全呢,什么是線程不安全呢,這些困擾了我們這么久

,在高并發情況下,我們要注意線程安全,全局變量一般都是線程不安全,而局部變量一般都是安全的看代碼

package org.thread;

public class Count {


    private int num =0;
    public void getCount() {

        for (int i = 0; i <= 100; i++) {
            num += i;
        }
        System.out.println(Thread.currentThread().getName() + "============"
                + num);
    }

}

這個方法是一個計數的方法,我希望他每次返回都是5050

package org.thread;

public class ThreadTest {

    public static void main(String[] args) {

        Runnable runnable = new Runnable() {

            Count count = new Count();
            @Override
            public void run() {

                count.getCount();

            }
        };

        for(int i = 0;i<=100;i++){
            new Thread(runnable).start();

        }
    }

}

這個是線程的測試類,線程啟動我希望他每次拿到都是5050

看結果

Thread-0============5050
Thread-2============10100
Thread-4============19336
Thread-9============39536
Thread-8============44586
Thread-6============49636
Thread-11============59736
Thread-3============24386
Thread-1============19336
Thread-15============64786
Thread-7============29436
Thread-12============54686
Thread-5============34486

Thread-0============5050這個
這有這個是我想要的,其他數據都是多余的

那么現在我想得到5050 有幾種方式

第一種

public class Count {


    public void getCount() {
        int num =0;
        for (int i = 0; i <= 100; i++) {
            num += i;
        }
        System.out.println(Thread.currentThread().getName() + "============"
                + num);
    }

}

private int num =0;設置成內部變量也就是在getCount方法中

得到的結果

Thread-0============5050
Thread-1============5050
Thread-6============5050
Thread-2============5050
Thread-3============5050
Thread-10============5050
Thread-8============5050
Thread-7============5050
Thread-5============5050
Thread-4============5050
Thread-9============5050

這個是我想要的

還有一種就是

Runnable runnable = new Runnable() {


            @Override
            public void run() {
                Count count = new Count();
                count.getCount();

            }
        };

Count count = new Count();放到run方法中,每次都創建

這種方法消耗內存性能,不提倡

得到的結果

Thread-0============5050
Thread-1============5050
Thread-6============5050
Thread-2============5050
Thread-3============5050
Thread-10============5050
Thread-8============5050
Thread-7============5050
Thread-5============5050
Thread-4============5050
Thread-9============5050


來自: http://my.oschina.net/heinrichchen/blog/604211

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!