关于synchronized

来源:互联网 发布:安倍经济学知乎 编辑:程序博客网 时间:2024/06/09 16:14

1、synchronized

大家在学习线程中经常会遇到同步问题,而经常用的就是synchronized这个关键字,大家可以把他理解成锁,你也可以把修饰的方法看作原子性的,也就是说这个方法在执行时必须要执行完,中间不能被其他的线程所执行。

2、问题:当一个类中两个方法m1(),m2()

(1)m1用synchronized修饰m2不用,当我访问m1方法时能在访问m2吗?
(2)如果他们两个都用synchronized修饰,当我访问m1方法时能在访问m2吗?

3、代码如下
(1)

package com.smart.framework.thread;/** * Created with IntelliJ IDEA. * Description: */public class TT implements  Runnable {    @Override    public void run() {        m1();    }    public synchronized void m1(){        try {            Thread.sleep(10000);        }catch (Exception e){            e.printStackTrace();        }        System.out.println("m1--->");    }    public void m2(){        System.out.println("m2--->");    }    public static void main(String args[]){        TT tt=new TT();        Thread thread=new Thread(tt);        thread.start();        try {            Thread.sleep(2000);        }catch (Exception e){            e.printStackTrace();        }        tt.m2();    }}

结果如下:
这里写图片描述

解释一下,上面调用sleep方法不是必须的,只是为了错开时间进行验证,来放大这个效果。

可以看到当访问锁定的方法是不影响访问不锁定的方法。
(2)

package com.smart.framework.thread;/** * Created with IntelliJ IDEA. * Description: */public class TT implements  Runnable {    @Override    public void run() {        m1();    }    public synchronized void m1(){        try {            Thread.sleep(10000);        }catch (Exception e){            e.printStackTrace();        }        System.out.println("m1--->");    }    public synchronized  void m2(){        System.out.println("m2--->");    }    public static void main(String args[]){        TT tt=new TT();        Thread thread=new Thread(tt);        thread.start();        try {            Thread.sleep(2000);        }catch (Exception e){            e.printStackTrace();        }        tt.m2();    }}

结果如下:
这里写图片描述

你会发现m2在m1之后运行,这说明在执行过程中是等m1执行完才开始执行m2的,就是在m1执行的过程中不能调用该对象的另一个被synchronized修饰的方法,必须等其结束才能执行。

原创粉丝点击