多语言展示
当前在线:1667今日阅读:176今日分享:34

你会用java中synchronized吗?---修饰方法

在Java代码中经常见到synchronized这个关键字。许多老鸟也经常使用synchronized。但是,你确定知道synchronized怎么用吗?本文简要介绍一下synchronized修饰非静态方法时的使用心得
工具/原料
1

java

2

synchronized

3

Thread

方法/步骤
2

运行上面的代码,可以看到。虽然开了两个线程,但仍然串行执行。就是因为synchronized 关键字。

3

如果想看到两个线程并发执行呢?去掉方法doBusiness的修饰关键字synchronized 了。不是说好的,讲synchronized的嘛!!好的,现在就说了。不去也行的,再新创建一个Business对象。让两个线程使用不同的Business实例了。Code:Worker workerFirst = new Worker(new Business());Worker workerSecond = new Worker(new Business());Thread threadFirst = new Thread(workerFirst, 'First');Thread threadSecond = new Thread(workerSecond, 'Second');threadFirst.start();threadSecond.start();

4

运行最新的Code。看看是不是得到预期的结果了,真是的!因为synchronized加在非static方法上,是实例级别的锁。只要是不同的实例,就不会出现互斥了Output:2016-03-14 22:58:12,580 [First] INFO - enter synchronized monitor2016-03-14 22:58:12,580 [Second] INFO - enter synchronized monitor2016-03-14 22:58:22,582 [First] INFO - leave synchronized monitor2016-03-14 22:58:22,582 [Second] INFO - leave synchronized monitor

5

如果不新建Business方法。新创建两个Work方法行不行呢。Let't have a tryCode:Business business = new Business();Worker workerFirst = new Worker(business);Worker workerSecond = new Worker(business);Thread threadFirst = new Thread(workerFirst, 'First');Thread threadSecond = new Thread(workerSecond, 'Second');threadFirst.start();threadSecond.start();

6

执行最新的Code,看看打印的结果是否与预期一致。Sorry,从打印的日志看,线程没有并发,仍然是串行执行的。因为Synchroinzed修饰非静态方法时,是实例级别的锁嘛

推荐信息