您的位置首页生活百科

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

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

的有关信息介绍如下:

你会用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修饰非静态方法时,是实例级别的锁嘛