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

结论:

  1. A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中非synchronized类型的方法。
  2. A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需等待,也就是同步。

以上是关于Java Synchronized的主要内容,如果未能解决你的问题,请参考以下文章

多线程 Thread 线程同步 synchronized

Java初识方法

Java并发编程实战—–synchronized

Java多线程与并发库高级应用-工具类介绍

Java多线程与并发库高级应用-工具类介绍

同步代码 [重复]