您的位置:首页 > 编程语言 > Java开发

java多线程----synchronized方法锁能否锁住对象呢?

2017-08-07 13:57 459 查看
先不着急回答,我们来进行这样的一个测试,创建一个线程类,线程类中有两个方法,一个是加了synchronized修饰符的同步方法twice(),另一个则是没有加synchronized修饰符的普通方法once(),在线程的run方法里面调用twice,在主线程中调用once,使用sleep方法保证twice先执行。我们来看一下结果。

先来说猜想:

1:如果说synchronized方法是将方法中的对象锁住,且同一时间有且仅有该方法可以读取、操作、改变该对象中的实例,那么主线程调用的once一定会等待twice完成后再运行。

2:如果说synchronized方法间才是同步执行的,那么once会与twice一起执行,若synchronized对方法内的对象锁定,所以once无法更改,once方法无效。

3:synchronized方法之间是同步执行的,与非synchronized方法之间不具有同步执行关系,且synchronized方法的锁仅对synchronized方法是可见的,普通方法无视这把锁,并不阻止别的方法改变对象的值。

package t4_threadsafe;

public class ThreadNew extends Thread {
private int i = 0;

public void once() {
i = 50;
System.out.println(Thread.currentThread().getName() + " once i = " + i);
}

public synchronized void twice() {
System.out.println("twice--------");
i += 1000;
System.out.println(Thread.currentThread().getName() + " twice i = " + i);
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void run() {
super.run();
this.twice();
}

public static void main(String[] args) {
ThreadNew n = new ThreadNew();
n.start();
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
n.once();
}
}


结果是这样的———–

twice--------
Thread-0 twice i = 1000
main once i = 50


很显然,猜想3正确
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程
相关文章推荐