synchronized效用的测试

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值