Java牛角尖【009】: 多线程中synchronized的锁定方式

本文通过实例演示了Java中synchronized方法如何实现对象级别的锁定。当一个线程正在执行对象的某个synchronized方法时,其他线程试图访问该对象的其他synchronized方法将被阻塞,直至当前线程释放锁。

  同一个对象中的一个synchronized方法如果已有一个线程进入,则其它的线程必须等该线程结束后才能进入该方法。那么,如果一个类中有多个synchronized方法,会有什么情况呢?

  看下面一段代码:

public class Test { static Test t = new Test(); static Test2 t2 = new Test2(); public static void main(String[] args) { // TODO Auto-generated method stub TestThread tt = t.new TestThread(); tt.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t2.test1(); } class TestThread extends Thread { @Override public void run() { // TODO Auto-generated method stub t2.test2(); } } } class Test2 { public synchronized void test1() { System.out.println("test1 called"); } public synchronized void test2() { System.out.println("test2 called"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("test2 exit"); } }

  运行结果如下:

test2 called test2 exit test1 called

  很明显,当对象t2的synchronized方法test2被线程tt调用时,主线程也无法进入其test1方法,直到线程tt对test2方法的调用结束,主线程才能进入test1方法。

  结论,对于synchronized方法,Java采用的是对象锁定的方式,当任何一个synchronized方法被访问的时候,该对象中的其它synchronized方法将全部不能被访问。

 

  下一篇: Java牛角尖【010】: 当对象a.equals(b)时,a.hashCode == b.hashCode吗?

转载于:https://www.cnblogs.com/moonsnow/archive/2009/06/11/6226852.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值