synchronized关键字加到static静态方法和synchronized关键字加到非static静态方法不是同一个锁也不存在前者包含后者的关系

synchronized关键字加到static静态方法上是给Class类上锁
而加到非static静态方法是给对象加锁
为了验证不是同一个锁 验证代码如下

package com.test.Thread.t10;

/**
 * @author admin
 * 2017年4月20日
 */
public class Service {

    synchronized public static void printA(){
        try {
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入pringA()");
            Thread.sleep(3000);
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开pringA()");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    synchronized public static void printB(){
        try {
            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入printB()");

            System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开printB()");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


//  synchronized public  void printC(){
//      try {
//          System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 进入printC()");
//          
//          System.out.println("线程名称为:"+Thread.currentThread().getName()+"在  "+System.currentTimeMillis()+" 离开printC()");
//      } catch (Exception e) {
//          e.printStackTrace();
//      }
//  }


    public static void main(String[] args) {
        Service s=new Service();
        ThreadA a=new ThreadA(s);
        a.setName("A");
        a.start();

        ThreadB b=new ThreadB(s);
        b.setName("B");
        b.start();
//      
//      ThreadC c=new ThreadC(s);
//      c.setName("C");
//      c.start();

    }
}

class ThreadA extends Thread{
    private Service s;

    public ThreadA(Service s) {
        super();
        this.s = s;
    }
    @Override
    public void run() {
        s.printA();
    }
}


class ThreadB extends Thread{
    private Service s;

    public ThreadB(Service s) {
        super();
        this.s = s;
    }
    @Override
    public void run() {
        s.printB();
    }
}
//
//class ThreadC extends Thread{
//  private Service s;
//  
//  public ThreadC(Service s) {
//      super();
//      this.s = s;
//  }
//  @Override
//  public void run() {
//      s.printC();
//  }
//}

运行结果如下
这里写图片描述
同步效果执行,执行后在执行第二个 如果加到非static方法就不一样了 是异步的效果
放开注释的部分代码 再次运行 效果如下
这里写图片描述

这里异步的原因是因为持有不同的锁,一个是对象锁 ,一个是class锁 而calss锁可以对类的所有实例起作用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
synchronized关键字可以应用于不同的地方,包括方法、代码块和静态方法。下面是每个地方的代码示例: 1. 同步方法: ```java public synchronized void synchronizedMethod() { // 在方法体内部对共享资源进行操作 } ``` 在上述示例中,使用synchronized关键字修饰了一个方法,使其成为同步方法。当线程调用该方法时,会获取该对象的,其他线程想要调用该方法时会被阻塞,直到获取到。 2. 同步代码块: ```java public void synchronizedBlock() { synchronized (this) { // 在代码块内部对共享资源进行操作 } } ``` 在上述示例中,使用synchronized关键字修饰了一个代码块。在括号内指定了一个对象作为,当线程进入该代码块时会尝试获取该对象的,其他线程想要进入同步代码块时会被阻塞,直到获取到。 3. 静态方法同步: ```java public static synchronized void synchronizedStaticMethod() { // 在静态方法内部对共享资源进行操作 } ``` 在上述示例中,使用synchronized关键字修饰了一个静态方法。当多个线程同时调用该静态方法时,它们会相互竞争获取类级别的,只有一个线程能够获得并执行该方法,其他线程需要等待释放才能执行。 需要注意的是,同步方法和同步代码块都是以对象为单位进行同步的。当多个线程访问同一个对象的同步方法或同步代码块时,它们会相互竞争获取对象的。若多个线程访问不同对象的同步方法或同步代码块,则它们不会相互影响,因为获取的是不同对象的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值