2.3静态synchronized同步方法和synchronized(class)代码块

来源:互联网 发布:arrayremove php 编辑:程序博客网 时间:2024/05/19 00:47

静态synchronized同步方法和synchronized(class)代码块

synchronized关键字加到static静态方法就是给Class类上锁,而synchronized(class)同步代码块的作用也是一样的。

package com.myObject;public class Object1 {    synchronized public void print() {        try {            System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin");            Thread.sleep(3000);            System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }    synchronized static public void print2() {        try {            System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin");            Thread.sleep(3000);            System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }     public void print3() {        try {            synchronized(Object1.class){            System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin");            Thread.sleep(3000);            System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end");            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package com.myThread;import com.myObject.Object1;public class Thread1a extends Thread {    Object1 object1;    public Thread1a(Object1 object1) {        this.object1 = object1;    }    @Override    public void run() {        super.run();        object1.print();    }}
package com.myThread;import com.myObject.Object1;public class Thread1b extends Thread {    Object1 object1;    public Thread1b(Object1 object1) {        this.object1 = object1;    }    @Override    public void run() {        super.run();        object1.print2();    }}
package com.myThread;import com.myObject.Object1;public class Thread1c extends Thread {    Object1 object1;    public Thread1c(Object1 object1) {        this.object1 = object1;    }    @Override    public void run() {        super.run();        object1.print3();    }}
package com.test;import com.myObject.Object1;import com.myThread.Thread1a;import com.myThread.Thread1b;import com.myThread.Thread1c;public class Test1 {    public static void main(String[] args) throws InterruptedException {        Object1 object1 = new Object1();        Thread1a thread1a = new Thread1a(object1);        thread1a.setName("a");        thread1a.start();        Thread1b thread1b = new Thread1b(object1);        thread1b.setName("b");        thread1b.start();        Thread1c thread1c = new Thread1c(object1);        thread1c.setName("c");        thread1c.start();    }}

打印结果

1452755386081 c:begin
1452755386081 a:begin
1452755389082 a:end
1452755389082 c:end
1452755389082 b:begin
1452755392082 b:end

分析:
1)a和b(或者c)对比是异步的,说明this锁和Class锁是不同的锁
2)b和c对比是同步的,说明静态synchronized同步方法和synchronized(class)代码块都是Class锁

this锁和Class锁的作用范围

this锁:同一对象同一实例
Class锁:同一对象的所有实例
将上面例子的测试方法改为

package com.test;import com.myObject.Object1;import com.myThread.Thread1a;import com.myThread.Thread1b;import com.myThread.Thread1c;public class Test1 {    public static void main(String[] args) throws InterruptedException {        Object1 object1 = new Object1();        Object1 object2 = new Object1();//      Thread1a thread1a = new Thread1a(object1);//      thread1a.setName("a");//      thread1a.start();        Thread1b thread1b = new Thread1b(object1);        thread1b.setName("b");        thread1b.start();        Thread1c thread1c = new Thread1c(object2);        thread1c.setName("c");        thread1c.start();    }}

打印结果

1452756237100 b:begin
1452756240100 b:end
1452756240100 c:begin
1452756243100 c:end

0 0
原创粉丝点击