国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JAVA--線程同步

2019-11-14 21:00:18
字體:
來源:轉載
供稿:網友
java--線程同步

  繼昨天線程介紹后,今天我又把線程中的同步問題總結了一下,現在就和大家一起探討一下。

  線程加鎖有什么用處呢?舉個例子:比如你現在有30000塊大洋在銀行存著,現在你到銀行取錢,當你輸入密碼完成后,已經輸入取款金額,比如你輸入的是20000,就是在銀行給你拿錢這個時刻,你老婆也去銀行取這筆錢,你老婆同樣取20000,因為此時你的賬上仍然是30000,所以銀行同樣的操作在你老婆那端有進行了一遍,這樣當你們兩個完成各自操作后,銀行記錄的你賬上還應該有10000塊存款,這樣是不是很爽。解決這個問題就用到了線程加鎖的知識,下面就讓我們一起來學習一下吧。

一、未處理線程同步的一個例子:

public class TextSync implements Runnable{    /**未處理線程同步     * @param args     */    Time time = new Time();    public static void main(String[] args) {        TextSync text = new TextSync();        Thread t1 = new Thread(text);        Thread t2 = new Thread(text);        t1.setName("t1");        t2.setName("t2");        t1.start();        t2.start();    }    @Override    public void run() {        time.add(Thread.currentThread().getName());    }}class Time {    PRivate static int num = 0;    public void add(String name){        try {            num++;            //當第一個線程執行到此時,num變成了1,第一個線程暫停一秒,            //第二個線程開始執行,當第二個線程執行到此時,num變成了2,第二個線程暫停一秒,            //第一個線程此時的num同樣變成了2,所以最終的結果均為2;            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(name+"是第"+num+"個執行的線程。");    }}

輸出結果:

二、線程同步

public class TextSynctwo implements Runnable{    /**線程同步     * @param args     */    Time1 time = new Time1();    public static void main(String[] args) {        TextSynctwo text = new TextSynctwo();        Thread t1 = new Thread(text);        Thread t2 = new Thread(text);        t1.setName("t1");        t2.setName("t2");        t1.start();        t2.start();    }    @Override    public void run() {        time.add(Thread.currentThread().getName());    }}class Time1 {    private static int num = 0;        //synchronized鎖定當前線程,可以在方法定義時進行聲明,或采用在方法中進行設置。    public synchronized void add(String name){        //synchronized (this) {//鎖定當前線程,防止此時被別的線程執行            try {                num++;                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(name+"是第"+num+"個執行的線程。");        //}    }}

輸出結果:

三、死鎖

public class TestDeadLock implements Runnable{    /**死鎖     * @param args     */    private int flag = 0 ;     static Object o1 = new Object();    static Object o2 = new Object();    public static void main(String[] args) {        TestDeadLock td1 = new TestDeadLock();         TestDeadLock td2 = new TestDeadLock();         td1.flag = 1;        td2.flag = 2;        Thread t1 = new Thread(td1);         Thread t2 = new Thread(td2);        t1.setName("t1");        t2.setName("t2");        t1.start();        t2.start();    }    @Override    public void run() {        System.out.println(Thread.currentThread().getName());        if(flag == 1){            synchronized(o1){                try {                    Thread.sleep(5000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                synchronized(o2){                    System.out.println("1");                }            }        }        if(flag == 2){            synchronized(o2){                try {                    Thread.sleep(5000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                synchronized(o1){                    System.out.println("2");                }            }        }    }}

四、鎖定

public class TT implements Runnable{    /**鎖定     * @param args     */    int b = 100;    public static void main(String[] args) {        TT tt = new TT();        Thread th = new Thread(tt);        th.start();        try {            tt.m2();        } catch (Exception e) {            e.printStackTrace();        }        System.out.println(tt.b);    }    @Override    public void run() {        try {            m1();        } catch (Exception e) {            e.printStackTrace();        }    }        private synchronized void m1() throws Exception{        b = 1000;        Thread.sleep(5000);        System.out.println("b="+b);    }    private synchronized void m2() throws Exception{        Thread.sleep(2500);        b = 2500;    } }

對于鎖定這個我有一個疑問,還望大神們給予指點,現在的輸出結果:

我想問的就是,問什么m2先執行,m1要等m2執行完畢后方可執行。

希望大家給予答復,謝謝


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东丰县| 社旗县| 铜陵市| 望城县| 五华县| 安远县| 大兴区| 华亭县| 玛曲县| 大丰市| 安新县| 盐亭县| 什邡市| 凉城县| 明光市| 灌云县| 辽源市| 大荔县| 阳东县| 鲁山县| 彰武县| 易门县| 夏邑县| 九龙城区| 平南县| 日照市| 民和| 新巴尔虎右旗| 乌恰县| 万宁市| 启东市| 米林县| 灵寿县| 平乐县| 乐都县| 马鞍山市| 宽城| 望谟县| 巴林左旗| 高碑店市| 宝坻区|