synchronized

1. 修饰静态方法中的代码块,两个线程是不同的Demo对象,同一个类锁,线程2无法进入。

把static去掉也一样。

class MyThread1 implements Runnable {
	private Demo demo; 
    public MyThread1(Demo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.demo1();
    }
}

class Demo {
    public static void demo1() {
    	synchronized(Demo.class) {
    		while (true) {
                System.out.println(Thread.currentThread());
           }
    	}
     }
}

Thread thread1 = new Thread(new MyThread1(new Demo()));
Thread thread2 = new Thread(new MyThread1(new Demo()));
thread1.start();
thread2.start();

2. 修饰静态方法,同上。

3.1 修饰普通成员方法中的代码块,两个线程是不同的Demo对象,不同的对象锁,两个线程都能进入。

class MyThread1 implements Runnable {
	private Demo demo; 
    public MyThread1(Demo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.demo1();
    }
}

class Demo {
    public void demo1() {
    	synchronized(this) {
    		while (true) {
                System.out.println(Thread.currentThread());
           }
    	}
     }
}

Thread thread1 = new Thread(new MyThread1(new Demo()));
Thread thread2 = new Thread(new MyThread1(new Demo()));
thread1.start();
thread2.start();

3.2 两个线程调用不同方法,thread1调用demo1,thread2调用demo2,都是同一个demo对象且都是o1锁,两个方法只能执行一个。

两个方法逻辑不相干,应该用不同的锁,demo2改为o2

class MyThread1 implements Runnable {
	private Demo demo; 
    public MyThread1(Demo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.demo1();
    }
}
class MyThread2 implements Runnable {
   private Demo demo;
   public MyThread2(Demo demo) {
       this.demo = demo;
   }
   @Override
   public void run() {
       demo.demo2();
   }
}

class Demo {
    Object o1 = new Object();
	Object o2 = new Object();
    public void demo1() {
    	synchronized(o1) {
    		while (true) {
                System.out.println(Thread.currentThread());
           }
    	}
     }
    public  void demo2() {
    	synchronized(o1) {
    		while (true) {
                System.out.println(Thread.currentThread());
           }
    	}
     }
}

Thread thread1 = new Thread(new MyThread1(d));
Thread thread2 = new Thread(new MyThread2(d));
thread1.start();
thread2.start();

​

4. 修饰普通成员方法,同3.1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值