美文网首页
Synchronized(Monitor)

Synchronized(Monitor)

作者: 程序设计法师 | 来源:发表于2018-12-21 18:38 被阅读0次

在同一个类中如果两个不同的方法method都被synchronized修饰,然后启动两个线程分别访问method1和method2,运行程序会发现只有一个方法被调用,另外一个方法根本没有被调用,原因是synchronized修饰了同一个实例对象的两个不同方法,T1线程获取了monitor的lock并且处于休眠状态,而T2线程企图获取monitor的lock时陷入阻塞状态,可见使用synchronized关键字同步类的不同实例方法,争抢的是同一个monitor的lock,而与之关联的引用则是该类的实例引用,我们来看下具体情况:

public class ThisMon {
    public synchronized void method1(){
        Log.e("ThisMon","Methond1执行");
        try {
            TimeUnit.MINUTES.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public synchronized void method2(){
        Log.e("ThisMon","Methond2执行");
        try {
            TimeUnit.MINUTES.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ThisMon {
    public synchronized void method1(){
        Log.e("ThisMon","Methond1执行");
        try {
            TimeUnit.MINUTES.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public  void method2(){
        synchronized (this) {
            Log.e("ThisMon", "Methond2执行");
            try {
                TimeUnit.MINUTES.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ThisMon {
    public static synchronized void method1(){
        Log.e("ThisMon","Methond1执行");
        try {
            TimeUnit.MINUTES.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static synchronized void method2(){
            Log.e("ThisMon", "Methond2执行");
            try {
                TimeUnit.MINUTES.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }
}
public class ThisMon {
    public static synchronized void method1(){
        Log.e("ThisMon","Methond1执行");
        try {
            TimeUnit.MINUTES.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static  void method2(){
        synchronized (ThisMon.class) {
            Log.e("ThisMon", "Methond2执行");
            try {
                TimeUnit.MINUTES.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ThisMonMainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ThisMon mon=new ThisMon();
        new Thread(new Runnable() {
            @Override
            public void run() {
                mon.method1();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                mon.method2();
            }
        }).start();
    }
}
12-21 18:29:51.222 2210-2230/e.lenovo.textapplication E/ThisMon: Methond2执行

synchronized有两个明显的缺陷,第一,无法控制阻塞时长,第二,阻塞不可被中断

相关文章

  • 线程同步synchronized

    monitor 同一monitor阻塞,不同monitor互斥 synchronized(锁) Java中每一个对...

  • Synchronized(Monitor)

    在同一个类中如果两个不同的方法method都被synchronized修饰,然后启动两个线程分别访问method1...

  • 查漏补缺之 Java 篇

    Java 中的 Monitor机制 参考: Java 多线程(二)-Monitor synchronized 与 ...

  • 从Synchronized说起各种锁

    一、synchronized synchronized原理: 进入和退出Monitor对象(每个对象都拥有一...

  • JUC-Synchronized & Lock

      Synchronized与Lock区别: Synchronized是关键字,属于JVM层面(monitor对象...

  • 2、synchronized关键字

    1. synchronized特点 1.1 简介 synchronized是基于monitor实现的,Synchr...

  • Java多线程-管程

    管程-Monitor 一种通用的同步原语,在Java中指的是synchronized,即synchronized是...

  • synchronized

    synchronized原理 Monitor对象 每个对象都可以关联一个Monitor对象,如果使用 synchr...

  • Synchronized原理、锁升级

    synchronized的实现原理 synchronized在JVM中是基于monitor对象实现方法同步和代码块...

  • 线程安全实现与CLH队列

    阻塞同步:synchronized——重量级锁 关键字:synchronized、重量级锁、锁对象、monitor...

网友评论

      本文标题:Synchronized(Monitor)

      本文链接:https://www.haomeiwen.com/subject/wlevkqtx.html