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锁可以对类的所有实例起作用