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

静态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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值