java
synchronized
Thread
运行上面的代码,可以看到。虽然开了两个线程,但仍然串行执行。就是因为synchronized 关键字。
如果想看到两个线程并发执行呢?去掉方法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();
运行最新的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
如果不新建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();
执行最新的Code,看看打印的结果是否与预期一致。Sorry,从打印的日志看,线程没有并发,仍然是串行执行的。因为Synchroinzed修饰非静态方法时,是实例级别的锁嘛