大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 線程同步的方法

線程同步的方法

更新時間:2021-07-09 16:09:31 來源:動力節(jié)點(diǎn) 瀏覽1175次

線程的同步是保證多線程安全訪問競爭資源的一種手段。

線程的同步是Java多線程編程的難點(diǎn),往往開發(fā)者搞不清楚什么是競爭資源、什么時候需要考慮同步,怎么同步等等問題,當(dāng)然,這些問題沒有很明確的答案,但有些原則問題需要考慮,是否有競爭資源被同時改動的問題?

對于同步,在具體的Java代碼中需要完成一下兩個操作:

把競爭訪問的資源標(biāo)識為private;

同步哪些修改變量的代碼,使用synchronized關(guān)鍵字同步方法或代碼。

當(dāng)然這不是唯一控制并發(fā)安全的途徑。

synchronized關(guān)鍵字使用說明

synchronized只能標(biāo)記非抽象的方法,不能標(biāo)識成員變量。

為了演示同步方法的使用,構(gòu)建了一個信用卡賬戶,起初信用額為100w,然后模擬透支、存款等多個操作。顯然銀行賬戶User對象是個競爭資源,而多個并發(fā)操作的是賬戶方法oper(int x),當(dāng)然應(yīng)該在此方法上加上同步,并將賬戶的余額設(shè)為私有變量,禁止直接訪問。

/**
* Java線程:線程的同步
*
* @author leizhimin 2009-11-4 11:23:32
*/
public class Test {
        public static void main(String[] args) {
                User u = new User("張三", 100);
                MyThread t1 = new MyThread("線程A", u, 20);
                MyThread t2 = new MyThread("線程B", u, -60);
                MyThread t3 = new MyThread("線程C", u, -80);
                MyThread t4 = new MyThread("線程D", u, -30);
                MyThread t5 = new MyThread("線程E", u, 32);
                MyThread t6 = new MyThread("線程F", u, 21);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
                t5.start();
                t6.start();
        }
}

class MyThread extends Thread {
        private User u;
        private int y = 0;

        MyThread(String name, User u, int y) {
                super(name);
                this.u = u;
                this.y = y;
        }

        public void run() {
                u.oper(y);
        }
}

class User {
        private String code;
        private int cash;

        User(String code, int cash) {
                this.code = code;
                this.cash = cash;
        }

        public String getCode() {
                return code;
        }

        public void setCode(String code) {
                this.code = code;
        }

        /**
         * 業(yè)務(wù)方法
         * @param x 添加x萬元
         */
        public synchronized void oper(int x) {
                try {
                        Thread.sleep(10L);
                        this.cash += x;
                        System.out.println(Thread.currentThread().getName() + "運(yùn)行結(jié)束,增加“" + x + "”,當(dāng)前用戶賬戶余額為:" + cash);
                        Thread.sleep(10L);
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
        }

        @Override
        public String toString() {
                return "User{" +
                                "code='" + code + '\'' +
                                ", cash=" + cash +
                                '}';
        }
}

輸出結(jié)果:

線程A運(yùn)行結(jié)束,增加“20”,當(dāng)前用戶賬戶余額為:120
線程F運(yùn)行結(jié)束,增加“21”,當(dāng)前用戶賬戶余額為:141
線程E運(yùn)行結(jié)束,增加“32”,當(dāng)前用戶賬戶余額為:173
線程C運(yùn)行結(jié)束,增加“-80”,當(dāng)前用戶賬戶余額為:93
線程B運(yùn)行結(jié)束,增加“-60”,當(dāng)前用戶賬戶余額為:33
線程D運(yùn)行結(jié)束,增加“-30”,當(dāng)前用戶賬戶余額為:3

Process finished with exit code 0

反面教材,不同步的情況,也就是去掉oper(int x)方法的synchronized修飾符,然后運(yùn)行程序,結(jié)果如下:

線程A運(yùn)行結(jié)束,增加“20”,當(dāng)前用戶賬戶余額為:61
線程D運(yùn)行結(jié)束,增加“-30”,當(dāng)前用戶賬戶余額為:63
線程B運(yùn)行結(jié)束,增加“-60”,當(dāng)前用戶賬戶余額為:3
線程F運(yùn)行結(jié)束,增加“21”,當(dāng)前用戶賬戶余額為:61
線程E運(yùn)行結(jié)束,增加“32”,當(dāng)前用戶賬戶余額為:93
線程C運(yùn)行結(jié)束,增加“-80”,當(dāng)前用戶賬戶余額為:61

Process finished with exit code 0

很顯然,上面的結(jié)果是錯誤的,導(dǎo)致錯誤的原因是多個線程并發(fā)訪問了競爭資源u,并對u的屬性做了改動。

可見同步的重要性。

注意:

通過前文可知,線程退出同步方法時將釋放掉方法所屬對象的鎖,但還應(yīng)該注意的是,同步方法中還可以使用特定的方法對線程進(jìn)行調(diào)度。這些方法來自于java.lang.Object類。

void notify()    
                    喚醒在此對象監(jiān)視器上等待的單個線程。    
void notifyAll()    
                    喚醒在此對象監(jiān)視器上等待的所有線程。    
void wait()    
                    導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法。    
void wait(long timeout)    
                    導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。    
void wait(long timeout, int nanos)    
                    導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當(dāng)前線程,或者已超過某個實際時間量。

結(jié)合以上方法,處理多線程同步與互斥問題非常重要,著名的生產(chǎn)者-消費(fèi)者例子就是一個經(jīng)典的例子,任何語言多線程必學(xué)的例子。

以上就是動力節(jié)點(diǎn)小編介紹的"線程同步的方法",希望對大家有幫助,想了解更多可查看Java多線程編程,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 成人综合久久精品色婷婷 | 一级免费a | 欧美综合另类 | 亚洲欧美日韩成人 | 国产午夜偷精品偷伦 | 亚洲sss综合天堂久久久 | 亚洲大片在线观看 | 男女一级毛片 | 伊人久久精品 | 中日韩欧美一级毛片 | 欧美日韩乱码毛片免费观看 | 国产精品1000部在线观看 | 欧美韩国日本一区 | 成熟日本语热亚洲人 | 激情久久婷婷 | 国内精品区一区二区三 | 香蕉久久ac一区二区三区 | 久久久久久久99精品免费观看 | 四虎国产精品免费久久麻豆 | 免费一级毛片无毒不卡 | 久久久久青草大香线综合精品 | 色久综合网 | 国产激情久久久久影院小草 | 男女车车好快的车车免费网站 | 国产在线观看自拍 | 久久性生活 | 色老头久久久久久久久久 | 99视频精品全国在线观看 | 伊人中文字幕在线观看 | 伊人快播| 欧美精品亚洲精品日韩专区 | 天天色天天射综合网 | 免费v片在线观看无遮挡 | 91久久亚洲精品国产一区二区 | 国产日产欧美一区二区三区 | 欧美爱爱爱爱免费视频 | 成人激情小视频 | 在线黄色免费 | 成人网久久 | 免费国产不卡午夜福在线观看 | 亚欧乱色精品免费观看 |