Java多线程学习(一)synchronized关键字

目录

  • 一、补充知识
    • 1.1 锁知识
    • 2.1 其他知识
  • 二、synchronized
    • 2.1 图解
    • 2.2 使用方式
    • 2.3可重入性
    • 2.4 配合wait、notify、notifyAll使用

一、补充知识

1.1 锁知识

  1. 悲观锁:线程获取的是独占锁,其他线程只能依靠阻塞等待线程释放锁。
  2. 乐观锁:每次不加锁&假设无冲突而去完成某项操作;若因冲突导致失败则重试,直到成功为止
  3. 类锁:类锁只是一个概念,Class类只有一个实例,所以它其实是Class对象的锁。static修饰的静态方法也是同理。
  4. 公平锁:维护一个队列,根据时间先后顺序来存储和执行
  5. 非公平锁:维护一个队列,正常情况下也是根据队列顺序来执行,但是在等待锁的过程中, 如果有任意新的线程妄图获取锁,都是有很大的几率直接获取到锁的。
    以下的图很有意思 来自博主公平锁和非公平锁

2.1 其他知识

  1. 原子性: 要么全部执行/ 要么全部不执行
  2. 可见行:当一个线程修改了共享属性后,其他线程立刻更新共享值。
    主存&工作内存,工作内存更改后马上更新到主存
  3. 提高性能,编译器&处理器会对代码重新排序,排序的结果跟单线程执行顺序是一样的
  4. 可重入锁:可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁

二、synchronized

2.1 图解

Java多线程学习(一)synchronized关键字_第1张图片

2.2 使用方式

 //对象锁1:方法锁
    public synchronized void third(){
        System.out.print("name");
    }

    //对象锁2: 对象
    public void fourth(Object object){
        synchronized (this){
            
        }
        //或者
        synchronized (object){
            
        }
        
    }

    //类锁1: 锁静态方法
    public synchronized static void first() {
        System.out.print("name");
    }

    //类锁2:锁静态代码块
    public static void second() {
        synchronized (Test3.class) {
            System.out.print("name");
        }
    }

2.3可重入性

定义:当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞

实现:实现方法是为每个锁关联一个线程持有者和计数器,当计数器为0时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;当某一线程请求成功后,JVM会记下锁的持有线程,并且将计数器置为1;此时其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;当线程退出同步代码块时,计数器会递减,如果计数器为0,则释放该锁。 这段抄录自java内置锁synchronized的可重入性
举个例子:

   public static void main(String[] args) {
        Test7 child = new Test7();
        child.doSomething();
    }

    public synchronized void doSomething() {
        System.out.println("doSomething()");
        doAnotherThing(); // 调用自己类中其他的synchronized方法

    }

    private synchronized void doAnotherThing() {
        System.out.println("doAnotherThing()");
    }

结果:
doSomething()
doAnotherThing()

2.4 配合wait、notify、notifyAll使用

Java多线程学习(二)wait、notify、notifyAll详解

你可能感兴趣的:(android,java)