多线程之synchronized(this)

来源:互联网 发布:js ajax获取网页 编辑:程序博客网 时间:2024/05/20 03:47

使用情景:我们有时候会使用多线程但是我们需要在调用某一个实例的时候,我们需要有序,比如,卖火车票的时候,我们要先判断是否有票,然后再出售票,当多个窗口卖火车票的时候,票池就会出错。会出现一张票被多个售票窗口重复出售。
使用方法:我们可以使用synchronized(this)来给票池枷锁,保证买票的时候,只能有一个售票员控制一张票。
实验代码:

package thread;public class SynchronizedCode implements Runnable {    private int aa;    public SynchronizedCode(int aa) {        this.aa = aa;    }    public void run() {        synchronized (this) {            try {                System.out.println("这是第一个" + aa);                Thread.sleep(aa);                System.out.println("-------" + aa);            } catch (Exception e) {                e.printStackTrace();            }        }    }    public static void main(String[] args) {        SynchronizedCode sc1 = new SynchronizedCode(2000);        SynchronizedCode sc2 = new SynchronizedCode(1000);        Thread thread1 = new Thread(sc1);        Thread thread2 = new Thread(sc2);        thread1.start();        thread2.start();    }}

实验结果:

这是第一个2000这是第一个1000-------1000-------2000

上面是因为我们使用了不同对象所以出现这样的实验结果。
当我们使用同一个对象的时候,实验代码如下:

package thread;public class SynchronizedCode implements Runnable {    private int aa;    public SynchronizedCode(int aa) {        this.aa = aa;    }    public void run() {        synchronized (this) {            try {                System.out.println("这是第一个" + aa);                Thread.sleep(aa);                System.out.println("-------" + aa);            } catch (Exception e) {                e.printStackTrace();            }        }    }    public static void main(String[] args) {        SynchronizedCode sc1 = new SynchronizedCode(2000);//      SynchronizedCode sc2 = new SynchronizedCode(1000);        Thread thread1 = new Thread(sc1);        Thread thread2 = new Thread(sc1);        thread1.start();        thread2.start();    }}

实验结果如下:

这是第一个2000-------2000这是第一个2000-------2000

当我们不使用synchronized的时候,实验代码如下:

package thread;public class SynchronizedCode implements Runnable {    private int aa;    public SynchronizedCode(int aa) {        this.aa = aa;    }    public void run() {//      synchronized (this) {            try {                System.out.println("这是第一个" + aa);                Thread.sleep(aa);                System.out.println("-------" + aa);            } catch (Exception e) {                e.printStackTrace();            }//      }    }    public static void main(String[] args) {        SynchronizedCode sc1 = new SynchronizedCode(2000);//      SynchronizedCode sc2 = new SynchronizedCode(1000);        Thread thread1 = new Thread(sc1);        Thread thread2 = new Thread(sc1);        thread1.start();        thread2.start();    }}

实验结果如下:

这是第一个2000这是第一个2000-------2000-------2000

通过对比我们就可以清楚的知道synchronized(this)的作用。

0 0