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方法是可见的,普通方法无视这把锁,并不阻止别的方法改变对象的值。
结果是这样的———–
很显然,猜想3正确
先来说猜想:
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多线程之-----对象及变量的并发访问1(synchronized同步方法)
- java多线程-synchronized对象和方法的区别
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- Java线程同步:synchronized锁住的是代码还是对象
- 九、初学Java多线程:使用Synchronized关键字同步类方法
- Java多线程的例子及synchronized关键字锁定对象的用法
- (转)初学Java多线程:使用Synchronized关键字同步类方法
- 关于java当中的多线程设计, wait/notify机制 , synchronized与对象锁
- Java多线程之~~~~synchronized 方法
- 跟着实例学习java多线程2-synchronized锁住的是对象还是代码
- Java线程同步:synchronized锁住的是代码还是对象
- java 同步 异步 (2)-- synchronized锁住的是代码还是对象
- Java线程同步:synchronized锁住的是代码还是对象
- Java线程同步:synchronized锁住的是代码还是对象
- Java线程同步:synchronized锁住的是代码还是对象
- (转)初学Java多线程:使用Synchronized关键字同步类方法
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- Java线程同步:synchronized锁住的是代码还是对象
- 初学Java多线程:使用Synchronized关键字同步类方法
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解