课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 静态方法中使用synchronized关键字制造同步块
  • 静态方法中使用synchronized关键字制造同步块

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

  • 昆明Java培训机构的老师给大家讲静态方法中使用synchronized关键字制造同步块

    同步块中默认被加锁的对象是此同步块括号声明中包含的对象。

    1 class staticMethodSynchronized {

    2    private static final Object OBJ = new Object();

    3    public static void method1() throws InterruptedException {

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

    5        synchronized(OBJ) {

    6            System.out.println(Thread.currentThread().getName() + ":获得锁");

    7            System.out.println(Thread.currentThread().getName() + ":释放锁");

    8        }

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

    10    }

    11    public static void method2() throws InterruptedException {

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

    13        synchronized(OBJ) {

    14            System.out.println(Thread.currentThread().getName() + ":获得锁");

    15            System.out.println(Thread.currentThread().getName() + ":释放锁");

    16        }

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

    18    }

    19 }

    20 public class TestStaticClassSynchronized {

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

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

    23

    24            @Override

    25            public void run() {

    26                // TODO Auto-generated method stub

    27                try {

    28                    staticMethodSynchronized.method1();

    29                } catch (InterruptedException e) {

    30                    // TODO Auto-generated catch block

    31                    e.printStackTrace();

    32                }

    33            }

    34            

    35        }, "t1");

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

    37

    38            @Override

    39            public void run() {

    40                // TODO Auto-generated method stub

    41                try {

    42                    staticMethodSynchronized.method2();

    43                } catch (InterruptedException e) {

    44                    // TODO Auto-generated catch block

    45                    e.printStackTrace();

    46                }

    47            }

    48            

    49        }, "t2");

    50        t1.start();

    51        t2.start();

    52    }

    53 }

    在上述代码中,两个静态方法中的同步块都要获得对象OBJ的锁才能继续向下执行。

    若t1线程先获得锁,则必须等到t1释放锁之后,t2线程中同步代码块及其之后的代码才能继续执行,t2线程先获得锁,t1线程同理。

    总之,昆明Java培训机构的老师认为我们只需抓住一点:Java中每个实例对象对应一把锁且每个实例对象只有一把锁,synchronized关键字是通过对相应的实例对象加锁来实现同步功能的(静态方法为对相应的class对象加锁)。在执行s ynchronized方法或synchronized同步块之前,我们只需判断其需要获得的对象的锁是否可获得,就可判断此方法或同步块是否可得到执行。

    推荐文章

上一篇:实例方法中使用synchronized关键字制造同步块

下一篇:java程序员:isEmpty与null、""的区别

最新开班日期  |  更多

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