synchronized的用法

这两天补了下多线程的东西,看了看书,看了看大牛们写的,有了写粗浅的理解,现在自己总结下

synchronized有两种用法,同步方法和同步代码块

总结如下:
1、当一个线程通过A对象访问一个非静态的同步方法(或同步代码块)时,其他线程通过A对象访问非静态同步方法(或同步代码块)的操作都会被锁定。但是其他线程通过A对象访问非静态非同步方法的操作不会被锁定,而且通过B对象访问非静态同步方法的操作也不会被锁。(因为各个对象的锁是独立的所以叫做对象锁)
2、当一个线程访问静态同步方法或者由类锁修饰的同步代码块时,所有该类的静态方法或者被同一个类锁修饰的同步代码块都会被锁定,其他线程无法访问。
3、类锁和对象锁互不影响。
4、修饰方法和修饰代码块在本质上是一样的,区别只在于修饰代码块的方式在竞争激烈的情况下更加高效。
5、注意区别以下代码的对象锁的持有情况

public class Human {
    //XiaoMing.eatDinner();
    public synchronized void eatDinner() {   //这里的锁是XiaoMing
        pickupByLeftHand();
        eatFoodByMouth();
    };
    
    //XiaoMing.eatDinner2();
    public void eatDinner() {
        synchronized(this) {    //这里的锁是XiaoMing
            pickupByLeftHand();
            eatFoodByMouth();
        }
    };
    
    //XiaoMing.drinkWater();
    public void drinkWater() {
        pickupByRightHand();
        synchronized (mouth) {  //这里的锁是mouth
            drinkWaterByMouth();
        }
    }
}

参考资料:https://blog.csdn.net/luoweifu/article/details/46613015
https://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
https://www.jianshu.com/p/9abdf1de5d40

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码...
    明教de教主阅读 686评论 0 2
  • synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码...
    4e70992f13e7阅读 563评论 0 9
  • 简介synchronized是Java中的的关键字,是一种同步锁,可以修饰以下几种1.1>:类作用的范围是:syn...
    世道无情阅读 4,077评论 0 3
  • 以前的工作过程中,偶尔会遇到synchronized的使用,比如这篇总结。今天来总结一下自己对synchroniz...
    德彪阅读 936评论 0 0
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,187评论 0 23