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

JAVA多线程之Synchronized关键字--对象锁的特点

时间:2016-05-02 18:27:05      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

一,介绍

本文介绍JAVA多线程中的synchronized关键字作为对象锁的特点。

 

二,分析

synchronized可以修饰实例方法,如下形式:

 

1 public class MyObject {
2 
3     synchronized public void methodA() {
4         //do something....
5     }

 

 

这里,synchronized 关键字锁住的是当前对象。这也是称为对象锁的原因。

为啥锁住当前对象?因为 methodA()是个实例方法,要想执行methodA(),需要以 对象.方法() 的形式进行调用(obj.methodA(),obj是MyObject类的一个对象,synchronized就是把obj这个对象加锁了)。

上面代码也可写成这样:

1 public class MyObject {
2 
3     public void methodA() {
4         synchronized(this){
5             //do something....
6         }
7     }

 

三,特点

使用synchronized关键字同步一个明显的特点是:MyObject类中定义有多个synchronized修饰的实例方法时,若多个线程拥有同一个MyObject类的对象则这些方法只能以同步的方式执行。即,执行完一个synchronized修饰的方法后,才能执行另一个synchronized修饰的方法。

如下:

 1 public class MyObject {
 2 
 3     synchronized public void methodA() {
 4         //do something....
 5     }
 6 
 7     synchronized public void methodB() {
 8         //do some other thing
 9     }
10 }

MyObject类中有两个synchronized修饰的方法。

 

 1 public class ThreadA extends Thread {
 2 
 3     private MyObject object;
 4 //省略构造方法
 5     @Override
 6     public void run() {
 7         super.run();
 8         object.methodA();
 9     }
10 }

线程A执行methodA()

 

public class ThreadB extends Thread {

    private MyObject object;
//省略构造方法
    @Override
    public void run() {
        super.run();
        object.methodB();
    }
}

线程B执行methodB()

 

public class Run {
    public static void main(String[] args) {
        MyObject object = new MyObject();

        //线程A与线程B 持有的是同一个对象:object
        ThreadA a = new ThreadA(object);
        ThreadB b = new ThreadB(object);
        a.start();
        b.start();
    }
}

由于线程A和线程B持有同一个MyObject类的对象object,尽管这两个线程需要调用不同的方法,但是必须是同步的,比如:线程B需要等待线程A执行完了methodA()方法之后,它才能执行methodB()方法。

 

四,结论

从上可以看出,本文中讲述的 synchronized 锁的范围是整个对象。如果一个类中有多个synchronized修饰的同步方法,且多个线程持有该类的同一个对象(该类的相同的对象),尽管它们调用不同的方法,各个方法的执行也是同步的。

如果各个同步的方法之间没有共享变量,或者说各个方法之间没有联系,但也只能同步执行,这会影响效率。

 

JAVA多线程之Synchronized关键字--对象锁的特点

标签:

原文地址:http://www.cnblogs.com/hapjin/p/5452663.html

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