synchronized修饰static方法,非static方法,代码块的区别(类锁,对象锁)一个类中多个synchronized

今天看了很多关于synchronized的博客,全部都是模棱两可很多都是抄的,上下不接的,很烦啊,去看看视频和实验一下,做个简单的记录,面试备用.


重点看一下: synchronized是同步锁,他所有修饰都是同步的.
作用的范围:synchronized所影响的一个或多个方法
作用的对象:synchronized所影响的一个或多个类


第一种 修饰一个代码块

synchronized(obj)
{
    //逻辑
}

这是同步代码块

  1. 作用的范围:是大括号{}括起来的代码
  2. 作用的对象:是调用这个代码块的对象

第二种 修饰一个非静态方法

public  synchronized void test1()
{
    //逻辑
}

底层synchronized 作用在对象上

  1. 作用的范围:整个方法
  2. 作用的对象:调用这个方法的对象
  3. 解释:也就是说调用这个方法的对象,如果里面有很多被synchronized 修饰方法情况下,
    有一个被调用其他的都得等着(但是不包含synchronized 静态方法).

第三种 修饰一个静态方法

public  static  synchronized void test1()
{
    //逻辑
}

底层synchronized 作用在类上

  1. 作用的范围:整个静态方法
  2. 作用的对象:这个类的所有对象
  3. 解释:此类所有对象(被new出了好几个对象)有多个被synchronized 修饰静态方法情况下,
    只要是有一个对象中一个静态方法被占用,其他所有对象中所有静态方法都得等着(但是不包含synchronized 普通方法).

第四种 修饰一个类

  1. 作用的范围:synchronized后面括号括起来的部分
  2. 作用的对象:这个类的所有对象
  3. 解释:没啥说的,就是一个类都锁了,不管什么方法,不管几个对象,一个吊用,其他都锁.

补充:修饰非静与修饰静,

  1. 修饰非静:这个就是对象锁(一个对象中有两个方法同时被synchronized,调用这两个方法时,只能同时执行一个。但它并不能使调用该方法的多个对象在执行顺序上互斥,就是多个对象调用这个方法它就没办法保证数据是不是出现同时被使用脏读这些问题,不知道描述精准吗,请大佬指正)

  2. 修饰静:这个就是类锁了,一锁锁一个类的所有对象.

  3. 修饰非静与修饰静,出现在同一个对象中他们不是一个锁, 各走各的,相互不影响.

以上是面试时候用的,如果我自己写线程锁肯定用ReentrantLock,毕竟synchronized的性能不提jdk的版本都是耍流氓,synchronized在1.6之前和1.8之后就是两个级别的,而且synchronized是重量锁底层是本地方法调用cpu,ReentrantLock却是一个在虚拟机里运用行的一组算法.(这几天整理一下写写ReentrantLock底层算法)

你可能感兴趣的:(sycnchronized,多线程,线程锁)