• synchronized修饰普通方法和静态方法


    首先,要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this。而修饰静态方法时,锁是类锁,也就是类名.class。

    synchronized修饰普通方法

    Synchronized修饰普通方法时,锁是对象锁(this)。

    当该类中有多个普通方法被Synchronized修饰(同步),那么这些方法的锁都是这个类的一个对象this。多个线程访问这些方法时,如果这些线程调用方法时使用的是同一个该类的对象,虽然他们访问不同方法,但是他们使用同一个对象来调用,那么这些方法的锁就是一样的,就是这个对象,那么会造成阻塞。如果多个线程通过不同的对象来调用方法(一般都是通过同一个对象访问),那么他们的锁就是不一样的,不会造成阻塞。

    基本上都是通过同一个对象操作的,因为不同对象的话,每个对象的数据都不一样,当然不会出现安全问题。

    多线程的安全问题,都是对于同一个对象操作的,(操作静态数据不需要同一个对象)

    例如,多线程对hashtable操作,肯定是对同一个对象,才会有共享数据。

    Hashtable中使用Synchronized来修饰方法,这样相当于对整张表进行锁定了,因为多个线程如果通过同一个HashTable对象访问方法,就会造成阻塞。

    但是,通过同一个对象调用非同步方法,是可以的,不会阻塞。

    synchronized修饰静态方法

    锁是类锁(.class)。这个范围就比对象锁大。这里就算是不同对象,但是只要是该类的对象,就使用的是同一把锁。多个线程调用该类的同步的静态方法时,都会阻塞。

  • 相关阅读:
    Java中的泛型
    Java中List、Collections实现梭哈游戏
    Java中HashMap案例
    Java中ArrayDeque,栈与队列
    Java中List的使用
    学会使用JDK API
    Java中的数学运算BigDecimal
    在清华听演讲语录
    Java面向对象深度
    类变量、实参、形参、方法参数、代码块参数
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/9152718.html
Copyright © 2020-2023  润新知