Java知识点学习(第11天)

CountDownLatch和Semaphore的区别和底层原理

CountDownLatch表示一个计数器,可以给CountDownLatch设置一个数值,一个线程如果调研了CountDownLatch的await方法就会阻塞,其他线程可以调用CountDownLatch的countDown方法来使数值减一,当数值被减为0时,所有的await的线程都会被唤醒。底层原理是调用await方法的所有线程都会利用AQS进行排队,一旦数值被减为0,就会将AQS排队中的线程依次唤醒。
Semaphore表示信号量,可以设置许可的个数,表示同时允许多少个线程使用该信号量,通过acquire方法来获取许可,如果没有许可,线程就会被阻塞,然后通过AQS进行排队,也可以通过release方法释放许可,当某个线程释放了许可,就会从AQS中排队的第一个线程开始一次唤醒,直到没有空闲许可。

谈谈对AQS的理解,AQS如何实现可重入锁?

  1. AQS是Java线程同步的框架,是JDK中很多锁工具的核心实现框架。
  2. AQS中维护了一个status信号量和一个线程组成的一个双向链表队列,其中线程队列就是给我们线程进行排队的,而status就相当于一个红绿灯,控制线程排队或者放行。
  3. 在可重入锁的情况下,status就表示加锁的次数,0表示无锁,每加一次锁,status就加一,释放锁就减一。

谈谈你对IOC的理解

IOC就是我们常说的控制反转,那么我们先回答以下问题:

什么是控制,控制了什么?
我们知道,当程序运行时,用的是具体的对象如OrderService对象,那么这些对象是什么时候创建,谁创建的呢?包括对象的属性是什么时候赋值的?谁赋值的?其实这些都不是我们程序员做的,是spring帮我们做的。

这就是控制,控制对象的创建,控制对象属性的赋值。

反转有什么用,为什么要反转?
比如我们有三个类,A类有属性C,B类有属性C,还有一个C类,如果程序要运行,那么我们需要创建三个对象,并且赋予属性。

A a = new A();
B b = new B();
C c = new C();
a.c = c;
b.c = c;

这样我们需要写5行代码,如果类更多,对应的属性更多,代码就会更多,如果我们将控制交给spring,会减轻程序员的很多负担,总结而言,IOC表示控制反转,如果使用spring,那么spring就会负责对象的创建以及对象属性的赋值,如果使用spring,那么对象的控制权也会交给spring。

单例Bean和单例模式的区别?

  • 单例模式是设计模式的一种,表示JVM中某个类的对象只有唯一一个。
  • 而单例Bean并不表示JVM中只能存在唯一的某个类的Bean对象。
  • 通过相同的名字, 在相同的spring容器中去获得bean的时候, 只要名字对应的bean是单例的,在这种范围下单例bean和单例模式是一样的。

你可能感兴趣的:(Java知识点,java,jvm)