synchronized关键字可以将对象或者类进行锁定,不让其他线程调用,使用代码进行测试
写一个类,其中方法不使用synchronized,然后用两个线程调用,代码及其结果为:
public void setName(String name) {
String beginTime = new SimpleDateFormat("HH:mm:ss SSS").format(new Date());
System.out.println(Thread.currentThread().getName()+"执行被锁方法开始间:"+beginTime);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
this.name = name;
String EndTime = new SimpleDateFormat("HH:mm:ss SSS").format(new Date());
System.out.println(Thread.currentThread().getName()+"执行被锁方法结束时间:"+EndTime);
}
//main调用
public static void main(String[] args) throws InterruptedException {
Person person = new Person();
System.out.println(person);
Thread thread0=new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
person.setName("lisi");
}
});
Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
person.setName("wangwu");
}
});
thread0.start();
thread1.start();
}
结果是双线程同时执行未被锁方法:
Person{name='zhangsan', id=1}
Thread-0线程开始执行
Thread-1线程开始执行
Thread-1执行未被锁方法开始时间:18:19:33 436
Thread-0执行未被锁方法开始时间:18:19:33 436
Thread-0执行未被锁方法结束时间:18:19:35 437
Thread-1执行未被锁方法结束时间:18:19:35 437
增加关键字sychronized之后
public synchronized void setName(String name) {
xxx
方法体同上,省略
xxx
}
结果为同时间只有一个线程能执行被锁方法
Person{name='zhangsan', id=1}
Thread-0线程开始执行
Thread-1线程开始执行
Thread-0执行被锁方法开始时间:18:24:37 602
Thread-0执行被锁方法结束时间:18:24:39 603
Thread-1执行被锁方法开始时间:18:24:39 605
Thread-1执行被锁方法结束时间:18:24:41 614