码迷,mamicode.com
首页 > 编程语言 > 详细

Java Synchronized

时间:2018-05-31 17:28:30      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:运行   法则   time   mil   strong   sleep   get   关键字   方法   

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

标签:运行   法则   time   mil   strong   sleep   get   关键字   方法   

原文地址:https://www.cnblogs.com/gouge/p/9117628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!