Java Synchronized
Posted 狗哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Synchronized相关的知识,希望对你有一定的参考价值。
1、synchronized 同步方法:
package com.test; public class TestObject { synchronized public void methodA() { try { System.out.println("begin methodA threadName=" + Thread.currentThread().getName() + " beigin time = " + System.currentTimeMillis()); Thread.sleep(1000); System.out.println("end methodA endTime=" + System.currentTimeMillis()); } catch (Exception e) { e.printStackTrace(); } } public void methodB() { try { System.out.println("begin methodB threadName=" + Thread.currentThread().getName() + " beigin time = " + System.currentTimeMillis()); Thread.sleep(1000); System.out.println("end methodB endTime=" + System.currentTimeMillis()); } catch (Exception e) { e.printStackTrace(); } } }
package com.test; public class Run { public static void main(String[] args) { TestObject object = new TestObject(); Thread a = new Thread(new Runnable() { @Override public void run() { object.methodA(); } }); Thread b = new Thread(new Runnable() { @Override public void run() { object.methodB(); } }); a.start(); b.start(); } }
运行结果: begin methodA threadName=Thread-0 beigin time = 1527756573018 begin methodB threadName=Thread-1 beigin time = 1527756573018 end methodB endTime=1527756574018 end methodA endTime=1527756574018
通过上面的代码可以得知,虽然线程A先蚩尤了object对象的锁,但是线程B完全可以异步调用非synchronized类型的方法。
如果将TestObject.java 中的methodB()方法前加上synchronized关键字。
#methodB()前加synchronized关键字运行结果: begin methodA threadName=Thread-0 beigin time = 1527756647320 end methodA endTime=1527756648321 begin methodB threadName=Thread-1 beigin time = 1527756648321 end methodB endTime=1527756649321
结论:
- A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中非synchronized类型的方法。
- A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需等待,也就是同步。
以上是关于Java Synchronized的主要内容,如果未能解决你的问题,请参考以下文章