java 多线程之Sychronization的三种使用情况

来源:互联网 发布:淘宝店铺运营方案 编辑:程序博客网 时间:2024/05/17 00:02

java 多线程之Sychronization的三种使用情况

 1.同步代码块     锁对象可以是任意的对象
 2.普通同步方法 锁对象默认是是 this
 3.静态同步方法 锁对象是当前类的class对象

测试这三种情况下的锁对象 如下:

主类

package Sychronization;/** * 测试类 * @author feige */public class SychronizationDemo {    public static void main(String[] args) {        MyRunnable mr=new MyRunnable();        Thread th1=new Thread(mr,"阿飞");        Thread th2=new Thread(mr,"阿瑞");        Thread th3=new Thread(mr,"靳杨");        th1.start();        th2.start();        th3.start();    }}

同步代码块的MyRunnable类 :

package Sychronization;public class MyRunnable implements Runnable {    //定义全局变量 private static int ticket=1000; private Object obj=new Object(); private int x=1;    @Overridepublic void run() {        while(true){            if(x%2==0){         synchronized(obj){//obj 同步锁必须锁住的是同一个对象            if(ticket>0){             x++;             System.out.println(Thread.currentThread().getName()+":"+ticket--);        }      }        }            else{            synchronized(obj){//obj 同步锁必须锁住的是同一个对象                if(ticket>0){                     x++;                     System.out.println(Thread.currentThread().getName()+":"+ticket--);                }            }        }        }        }}

普通同步方法的MyRunnable类 :

package Sychronization;public class MyRunnable implements Runnable {    //定义全局变量 private static int ticket=1000; private Object obj=new Object(); private int x=1;    @Override    public void run() {    while(true){        if(x%2==0){     synchronized(this){        if(ticket>0){        x++;         System.out.println(Thread.currentThread().getName()+":"+ticket--);    }  }    }        else{            show();        }    }    }    public synchronized void show(){        if(ticket>0){            x++;             System.out.println(Thread.currentThread().getName()+":"+ticket--);        }    }}

静态同步方法的MyRunnable类 :

package Sychronization;public class MyRunnable implements Runnable {    //定义全局变量 private static int ticket=1000; private Object obj=new Object(); private static int x=1;    @Override    public void run() {    while(true){        if(x%2==0){     synchronized(MyRunnable.class){        if(ticket>0){        x++;         System.out.println(Thread.currentThread().getName()+":"+ticket--);    }  }    }        else{            show();        }    }    }    public static  synchronized void show(){        if(ticket>0){            x++;             System.out.println(Thread.currentThread().getName()+":"+ticket--);        }    }}

0 0
原创粉丝点击