你会用java中synchronized吗?---修饰方法
的有关信息介绍如下:
在Java代码中经常见到synchronized这个关键字。
许多老鸟也经常使用synchronized。但是,你确定知道synchronized怎么用吗?
本文简要介绍一下synchronized修饰非静态方法时的使用心得
Synchroinzed修饰非静态方法时,是实例级别的锁,同一个对象的实例在多个线程中执行时,会互斥,一次只能由一个线程来执行这个加锁的方法。
为说明synchronized的用法做点准备工作。
搭个台,先
Code::
package chapter2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
/**
* Created by MyWorld on 2016/3/14.
*/
public class SynchronizedDemo {
public static void main(String[] args) {
Business business = new Business();
Worker worker = new Worker(business);
Thread threadFirst = new Thread(worker, "First");
Thread threadSecond = new Thread(worker, "Second");
threadFirst.start();
threadSecond.start();
}
}
class Worker implements Runnable {
private Business business;
public Worker(Business business) {
this.business = business;
}
@Override
public void run() {
try {
business.doBusiness();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Business {
private static Logger logger = LoggerFactory.getLogger(Business.class); public synchronized void doBusiness() throws InterruptedException { logger.info("enter synchronized monitor");
TimeUnit.SECONDS.sleep(10);
logger.info("leave synchronized monitor");
}
}
运行上面的代码,可以看到。虽然开了两个线程,但仍然串行执行。
就是因为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 monitor
2016-03-14 22:58:12,580 [Second] INFO - enter synchronized monitor
2016-03-14 22:58:22,582 [First] INFO - leave synchronized monitor
2016-03-14 22:58:22,582 [Second] INFO - leave synchronized monitor
如果不新建Business方法。新创建两个Work方法行不行呢。
Let't have a try
Code:
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修饰非静态方法时,是实例级别的锁嘛



