在Java代码中经常见到synchronized这个关键字。
许多老鸟也经常使用synchronized。但是,你确定知道synchronized怎么用吗?
本文简要介绍一下synchronized修饰非静态方法时的使用心得
前期准备工作(包括相关工具或所使用的原料等)javasynchronizedThread 详细的操作方法或具体步骤
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修饰非静态方法时,是实例级别的锁嘛

- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
