Java多线程-线程同步

时间:2022-12-22 23:25:16

Java多线程-线程同步


前面的实例已经设计到同步问题:


上代码:

12345678910111213141516171819202122232425262728293031323334 package com.java1234.chap09.sec05; public class Thread1 implements Runnable{     private int baoZi=1;         private String threadName;     public Thread1(String threadName) {        super();        this.threadName = threadName;    }     @Override    public void run() {        while(baoZi<=10){            System.out.println(threadName+" 吃第"+baoZi+"个包子");            baoZi++;        }    }         public static void main(String[] args) {        Thread1 t1=new Thread1("超级张三线程");         Thread t11=new Thread(t1);        Thread t12=new Thread(t1);        Thread t13=new Thread(t1);                 t11.start();        t12.start();        t13.start();    } }

运行输出:

超级张三线程 吃第1个包子

超级张三线程 吃第1个包子

超级张三线程 吃第2个包子

超级张三线程 吃第3个包子

超级张三线程 吃第4个包子

超级张三线程 吃第5个包子

超级张三线程 吃第6个包子

超级张三线程 吃第7个包子

超级张三线程 吃第8个包子

超级张三线程 吃第9个包子

超级张三线程 吃第11个包子

超级张三线程 吃第8个包子


我们发现 会有多个线程同时进入方法吃包子的情况发生,这时候,就引入了线程同步。可以给方法加同步,同一时刻,只允许一个线程进入方法;

关键字 synchronized

12345678910111213141516171819202122232425262728293031323334 package com.java1234.chap09.sec05; public class Thread3 implements Runnable{     private int baoZi=1;         private String threadName;     public Thread3(String threadName) {        super();        this.threadName = threadName;    }     @Override    public synchronized void run() {        while(baoZi<=10){            System.out.println(threadName+" 吃第"+baoZi+"个包子");            baoZi++;        }    }         public static void main(String[] args) {        Thread3 t1=new Thread3("超级张三线程");         Thread t11=new Thread(t1);        Thread t12=new Thread(t1);        Thread t13=new Thread(t1);                 t11.start();        t12.start();        t13.start();    } }

运行输出:

超级张三线程 吃第1个包子

超级张三线程 吃第2个包子

超级张三线程 吃第3个包子

超级张三线程 吃第4个包子

超级张三线程 吃第5个包子

超级张三线程 吃第6个包子

超级张三线程 吃第7个包子

超级张三线程 吃第8个包子

超级张三线程 吃第9个包子

超级张三线程 吃第10个包子


也可以用同步块:

123456789101112131415161718192021222324252627282930313233343536373839 package com.java1234.chap09.sec05; public class Thread4 implements Runnable{     private int baoZi=1;         private String threadName;     public Thread4(String threadName) {        super();        this.threadName = threadName;    }     @Override    public void run() {        /**         * 同步块         */        synchronized (this) {            while(baoZi<=10){                System.out.println(threadName+" 吃第"+baoZi+"个包子");                baoZi++;            }        }    }         public static void main(String[] args) {        Thread4 t1=new Thread4("超级张三线程");         Thread t11=new Thread(t1);        Thread t12=new Thread(t1);        Thread t13=new Thread(t1);                 t11.start();        t12.start();        t13.start();    } }

运行结果一样;