课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java synchronized实例方法使用synchronized加锁
  • Java synchronized实例方法使用synchronized加锁

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-07

  • 本篇昆明Java培训班的老师主要介绍java中synchronized关键字常用法,主要有以下四个方面:

    1、实例方法同步

    2、静态方法同步

    3、实例方法中同步块

    4、静态方法中同步块

    昆明Java培训班的老师觉得在学习synchronized关键字之前,同学们首先需要知道以下一点:Java中每个实例对象对应一把锁且每个实例对象只有一把锁,synchronized关键字是通过对相应的实例对象加锁来实现同步功能的。今天昆明Java 训班的老师先讲第一部分。

    一、实例方法中使用synchronized加锁

    实例方法中默认被加锁的对象是调用此方法的实例对象。

    1 class ImmutableValue {

    2    public synchronized void comeIn() throws InterruptedException{

    3        System.out.println(Thread.currentThread().getName() + ": start");

    4        Thread.sleep(5000);

    5        System.out.println(Thread.currentThread().getName() + ": finish");

    6    }

    7    public void synchronized comeInIn() throws InterruptedException {

    8        System.out.println(Thread.currentThread().getName() + ": start");

    9        Thread.sleep(5000);

    10        System.out.println(Thread.currentThread().getName() + ": finish");

    11    }

    12 }

    13 public class TestImmutableValue {

    14    public static void main(String[] args) {

    15        ImmutableValue im = new ImmutableValue();

    16        Thread t1 = new Thread(new Runnable() {

    17

    18            @Override

    19            public void run() {

    20                // TODO Auto-generated method stub

    21                try {

    22                    im.comeIn();

    23                } catch (InterruptedException e) {

    24                    // TODO Auto-generated catch block

    25                    e.printStackTrace();

    26                }

    27            }

    28            

    29        }, "t1");

    30        Thread t2 = new Thread(new Runnable() {

    31

    32            @Override

    33            public void run() {

    34                // TODO Auto-generated method stub

    35                try {

    36                    im.comeInIn();

    37                } catch (InterruptedException e) {

    38                    // TODO Auto-generated catch block

    39                    e.printStackTrace();

    40                }

    41            }

    42            

    43        }, "t2");

    44        t1.start();

    45        t2.start();

    46    }

    47 }

    在上面的代码中创建了两个线程并分别命名为t1,t2。调用了同一个对象im的两个同步方法comeIn和comeInIn。

    在t1线程开始执行后,即使t1线程睡眠了5s,线程t2中的comeInIn方法仍然没有得到执行。这是因为t1线程先执行的comeIn方法,持有了对象im的锁,且comeIn方法并没有执行完,对象im的锁没有被释放,所以comeInIn方法无法对对象im加锁, 就无法继续执行,只能等到t1线程中的comeIn方法执行完毕,释放对象im的锁,comeInIn方法才能继续执行。

    但是如果t1线程调用的是对象im的comeIn方法,而t2线程调用的是我们声明的另外一个 ImmutableValue对象im2对象的comeInIn方法,则这两个方法的执行是互不影响的。因为t1线程的comeIn方法要获得im对象的锁,而t2线程要获得的是im2对 的锁,两个锁并不是同一个锁(Java中每个实例对象都有且只有一个锁),所以这两个方法执行互不影响。

    学Java开发就到昆明达内Java培训班!了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:【Java培训机构】ssh框架整合

下一篇:Java synchronized静态方法使用synchronized加锁

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56