当前位置: 首页 > article >正文

Java 并发编程封神!从入门到精通,面试再也不怕被问爆

目录synchronized 支持重入吗如何实现的?syncronized锁升级的过程讲一下JVM对Synchornized的优化介绍一下AQSCAS 和 AQS 有什么关系如何用 AQS 实现一个可重入的公平锁Threadlocal作用原理具体里面存的key value是啥会有什么问题如何解决?悲观锁和乐观锁的区别Java中想实现一个乐观锁都有哪些方式CAS 有什么缺点为什么不能所有的锁都用CASCAS 有什么问题Java是怎么解决的voliatle关键字有什么作用指令重排序的原理是什么volatile可以保证线程安全吗volatile和sychronized比较什么是公平锁和非公平锁非公平锁吞吐量为什么比公平锁大Synchronized是公平锁吗ReentrantLock是怎么实现公平锁的什么情况会产生死锁问题如何解决线程池介绍一下线程池的工作原理线程池的参数有哪些线程池工作队列满了有哪些拒接策略有线程池参数设置的经验吗核心线程数设置为0可不可以线程池种类有哪些线程池一般是怎么用的线程池中shutdown ()shutdownNow()这两个方法有什么作用提交给线程池中的任务可以被撤回吗场景多线程打印奇偶数怎么控制打印的顺序单例模型既然已经用了synchronized为什么还要在加volatile3个线程并发执行1个线程等待这三个线程全部执行完在执行怎么实现假设两个线程并发读写同一个整型变量初始值为零每个线程加 50 次结果可能是什么synchronized 支持重入吗如何实现的?synchronized是基于原子性的内部锁机制是可重入的因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法也就是说一个线程得到一个对象锁后再次请求该对象锁是允许的这就是synchronized的可重入性。synchronized底层是利用计算机系统mutex Lock实现的。每一个可重入锁都会关联一个线程ID和一个锁状态status。当一个线程请求方法时会去检查锁状态。如果锁状态是0代表该锁没有被占用使用CAS操作获取锁将线程ID替换成自己的线程ID。如果锁状态不是0代表有线程在访问该方法。此时如果线程ID是自己的线程ID如果是可重入锁会将status自增1然后获取到该锁进而执行相应的方法如果是非重入锁就会进入阻塞队列等待。在释放锁时如果是可重入锁的每一次退出方法就会将status减1直至status的值为0最后释放该锁。如果非可重入锁的线程退出方法直接就会释放该锁syncronized锁升级的过程讲一下无锁-偏向锁-轻量级锁-重量级锁。对象刚创建时对象头的Mark Word为无锁状态无线程关联。当我们第一个线程获取该锁的时候就会升级成偏向锁第一次通过cas方式将线程id放到对象头mark word中修改成功就获取该锁后续该线程再次获取锁时不用cas方式只需检查Mark Word的线程ID是否相等——是则直接获取锁第二个线程尝试获取该锁Mark Word的线程ID不是当前线程id偏向锁失效,升级为轻量级锁,线程通过CAS操作将Mark Word替换为自己的锁记录指针,成功就获取轻量级锁失败了自旋若自旋达到上限仍未获取锁轻量级锁升级为重量级锁未获取锁的线程进入操作系统阻塞队列后续通过操作系统互斥量竞争锁。JVM对Synchornized的优化锁膨胀锁升级synchronized 从无锁升级到偏向锁再到轻量级锁最后到重量级锁的过程它叫做锁膨胀也叫做锁升级。JDK 1.6 之前synchronized 是重量级锁也就是说 synchronized 在释放和获取锁时都会从用户态转换成内核态而转换的效率是比较低的。但有了锁膨胀机制之后synchronized 的状态就多了无锁、偏向锁以及轻量级锁了这时候在进行并发操作时大部分的场景都不需要用户态到内核态的转换了这样就大幅的提升了 synchronized 的性能。锁消除JVM 虚拟机如果检测到这段代码的锁只有当前线程能用没有任何其他线程会碰就会将这段代码所属的同步锁消除掉从而到底提高程序性能的目的。锁粗化将多个连续的加锁、解锁操作连接在一起扩展成一个范围更大的锁就是多次小锁”合并成“一次大锁”减少“锁操作的次数”•自适应自旋锁指通过自身循环尝试获取锁的一种方式优点在于它避免一些线程的挂起和恢复操作因为挂起线程和恢复线程都需要从用户态转入内核态这个过程是比较慢的所以通过自旋的方式可以一定程度上避免线程挂起和恢复所造成的性能开销。介绍一下AQSAQS的话其实就一个jdk提供的类AbstractQueuedSynchronizer抽象队列同步器是阻塞式锁和相关的同步器工具的框架。内部有一个属性 state 属性来表示资源的状态默认state等于0表示没有获取锁state等于1的时候才标明获取到了锁。通过cas 机制设置 state 状态在它的内部还提供了基于 FIFO 的等待队列是一个双向列表其中tail 指向队列最后一个元素head 指向队列中最久的一个元素其中我们刚刚聊的ReentrantLock底层的实现就是一个AQS。CAS 和 AQS 有什么关系CAS 和 AQS 两者的区别• CAS 是一种乐观锁机制它包含三个操作数内存位置V、预期值A和新值B。CAS 操作的逻辑是如果内存位置 V 的值等于预期值 A则将其更新为新值 B否则不做任何操作。整个过程是原子性的。• AQS 是一个用于构建锁和同步器的框架许多同步器如 ReentrantLock、Semaphore、CountDownLatch 等都是基于 AQS 构建的。AQS 使用一个 volatile 的整数变量 state 来表示同步状态通过内置的 FIFO 队列来管理等待线程。它提供了一些基本的操作如 acquire获取资源和 release释放资源这些操作会修改 state 的值并根据 state 的值来判断线程是否可以获取或释放资源。AQS 的 acquire 操作通常会先尝试获取资源如果失败线程将被添加到等待队列中并阻塞等待。release 操作会释放资源并唤醒等待队列中的线程。CAS 和 AQS 两者的联系• CAS 为 AQS 提供原子操作支持AQS 内部使用 CAS 操作来更新 state 变量以实现线程安全的状态修改。在 acquire 操作中当线程尝试获取资源时会使用 CAS 操作尝试将 state 从一个值更新为另一个值如果更新失败说明资源已被占用线程会进入等待队列。在 release 操作中当线程释放资源时也会使用 CAS 操作将 state 恢复到相应的值以保证状态更新的原子性。如何用 AQS 实现一个可重入的公平锁继承 AbstractQueuedSynchronizer实现可重入逻辑检查当前线程是否已经持有锁如果是则增加锁的持有次数通过 state 变量如果不是尝试使用 CAS操作来获取锁。实现公平性按照队列顺序来获取锁创建锁的外部类创建一个外部类内部持有 AbstractQueuedSynchronizer 的子类对象并提供 lock 和 unlock 方法进行获取锁和释放锁。Threadlocal作用原理具体里面存的key value是啥会有什么问题如何解决?面试官谈谈你对ThreadLocal的理解候选人嗯是这样的~~ThreadLocal 主要功能有两个第一个是可以实现资源对象的线程隔离让每个线程各用各的资源对象避免争用引发的线程安全问题第二个是实现了线程内的资源共享面试官好的那你知道ThreadLocal的底层原理实现吗候选人嗯知道一些~在ThreadLocal内部维护了一个一个 ThreadLocalMap 类型的成员变量用来存储资源对象当我们调用 set 方法就是以 ThreadLocal 自己作为 key资源对象作为 value放入当前线程的 ThreadLocalMap 集合中当调用 get 方法就是以 ThreadLocal 自己作为 key到当前线程中查找关联的资源值当调用 remove 方法就是以 ThreadLocal 自己作为 key移除当前线程关联的资源值面试官好的那关于ThreadLocal会导致内存溢出这个事情了解吗候选人嗯我之前看过源码我想一下~~是因为ThreadLocalMap 中的 key 被设计为弱引用它是被动的被GC调用释放key不过关键的是只有key可以得到内存释放而value不会因为value是一个强引用。在使用ThreadLocal 时都把它作为静态变量即强引用因此无法被动依靠 GC 回收建议主动的remove 释放 key这样就能避免内存溢出。悲观锁和乐观锁的区别乐观锁的思想最乐观的估计不一定的线程来修改共享变量它在操作共享数据时不先加锁而是直接读取/修改数据操作完成后通过某种机制如版本号、CAS验证数据是否被其他线程修改过。若未被修改则提交若被修改则重试悲观锁的思想最悲观的估计一定会有其它线程来修改共享变量操作共享数据前先主动加锁确保在操作期间其他线程无法修改数据从而避免数据竞争。Java中想实现一个乐观锁都有哪些方式CASCompare and Swap操作版本号控制增加一个版本号字段记录数据更新时候的版本每次更新时递增版本号。在更新数据时同时比较版本号若当前版本号和更新前获取的版本号一致则更新成功否则失败。时间戳在更新数据时在比较时间戳。如果当前时间戳大于数据的时间戳则说明数据已经被其他线程更新更新失败CAS 有什么缺点ABA问题ABA的问题指的是在CAS更新的过程中逻辑是“当前值是否等于预期旧值”但如果数据被修改为其他值后又改回原值如A→B→ACAS会误以为“数据未被修改”导致操作错误。Java中有AtomicStampedReference来解决这个问题加入了预期标志和更新后标志两个字段更新时不光检查值还要检查当前的标志是否等于预期标志全部相等的话才会更新。循环时间长开销大自旋CAS的方式如果长时间不成功会给CPU带来很大的开销。只能保证一个共享变量的原子操作只对一个共享变量操作可以保证原子性但是多个则不行多个可以通过AtomicReference来处理或者使用锁synchronized实现为什么不能所有的锁都用CASCAS操作是基于循环重试的机制如果CAS操作一直未能成功线程会一直自旋重试占用CPU资源。在高并发情况下大量线程自旋会导致CPU资源浪费。CAS 有什么问题Java是怎么解决的CAS 操作中增加版本号Stamp或标记每次修改都更新版本号使验证时不仅检查值还要检查版本号是否匹配。voliatle关键字有什么作用保证变量对所有线程的可见性。禁止指令重排序优化volatile关键字在Java中主要通过内存屏障来禁止特定类型的指令重排序指令重排序的原理是什么在执行程序时为了提高性能处理器和编译器常常会对指令进行重排序但是重排序要满足下面 2 个条件才能进行• 在单线程环境下不能改变程序运行的结果• 存在数据依赖关系的不允许重排序。volatile可以保证线程安全吗volatile关键字可以保证可见性但不能保证原子性因此不能完全保证线程安全。volatile关键字用于修饰变量当一个线程修改了volatile修饰的变量的值其他线程能够立即看到最新的值从而避免了线程之间的数据不一致。但是volatile并不能解决多线程并发下的复合操作问题比如i这种操作不是原子操作如果多个线程同时对i进行自增操作volatile不能保证线程安全。对于复合操作需要使用synchronized关键字或者Lock来保证原子性和线程安全。volatile和sychronized比较Synchronized解决了多线程访问共享资源时可能出现的竞态条件和数据不一致的问题保证了线程安全性。Volatile解决了变量在多线程环境下的可见性和有序性问题确保了变量的修改对其他线程是可见的。Synchronized: Synchronized是一种排他性的同步机制保证了多个线程访问共享资源时的互斥性即同一时刻只允许一个线程访问共享资源Volatile: Volatile是一种轻量级的同步机制用来保证变量的可见性和禁止指令重排序。什么是公平锁和非公平锁公平锁 指多个线程按照申请锁的顺序来获取锁线程直接进入队列中排队队列中的第一个线程才能获得锁。优点在于各个线程公平平等每个线程等待一段时间后都有执行的机会缺点就在于整体执行速度更慢吞吐量更小。非公平锁多个线程加锁时直接尝试获取锁能抢到锁到直接占有锁抢不到才会到等待队列的队尾等待。优点就在于整体执行速度更快吞吐量更大缺点同时也可能产生线程饥饿问题也就是说如果一直有线程插队那么在等待队列中的线程可能长时间得不到运行。非公平锁吞吐量为什么比公平锁大公平锁执行流程获取锁时先将线程自己添加到等待队列的队尾并休眠当某线程用完锁之后会去唤醒等待队列中队首的线程尝试去获取锁锁的使用顺序也就是队列中的先后顺序在整个过程中线程会从运行状态切换到休眠状态再从休眠状态恢复成运行状态但线程每次休眠和恢复都需要从用户态转换成内核态而这个状态的转换是比较慢的所以公平锁的执行速度会比较慢。非公平锁执行流程当线程获取锁时会先通过 CAS 尝试获取锁如果获取成功就直接拥有锁如果获取锁失败才会进入等待队列等待下次尝试获取锁。这样做的好处是获取锁不用遵循先到先得的规则从而避免了线程休眠和恢复的操作这样就加速了程序的执行效率。Synchronized是公平锁吗Synchronized不属于公平锁ReentrantLock是公平锁。ReentrantLock是怎么实现公平锁的ReentrantLock公平锁与非公平锁的 lock() 方法唯一的区别就在于公平锁在获取锁时多了一个限制条件hasQueuedPredecessors() 为 false。公平锁和非公平锁的核心区别如果是公平锁那么一旦已经有线程在排队了当前线程就不再尝试获取锁对于非公平锁而言无论是否已经有线程在排队都会尝试获取一下锁获取不到的话再去排队。tryLock() 方法它不遵守设定的公平原则。线程执行 tryLock() 方法的时候一旦有线程释放了锁那么这个正在 tryLock 的线程就能获取到锁即使设置的是公平锁模式就是tryLock 可以插队。底层调用的就是nonfairTryAcquire()表明了是不公平的。什么情况会产生死锁问题如何解决死锁只有同时满足以下四个条件才会发生互斥条件互斥条件是指多个线程不能同时使用同一个资源。持有并等待条件持有并等待条件是指当线程 A 已经持有了资源 1又想申请资源 2而资源 2 已经被线程 C 持有了所以线程 A 就会处于等待状态但是线程 A 在等待资源 2 的同时并不会释放自己已经持有的资源 1。不可剥夺条件不可剥夺条件是指当线程已经持有了资源在自己使用完之前不能被其他线程获取线程 B 如果也想使用此资源则只能在线程 A 使用完并释放后才能获取。环路等待条件环路等待条件指的是在死锁发生的时候两个线程获取资源的顺序构成了环形链避免死锁问题就只需要破环其中一个条件就可以线程池介绍一下线程池的工作原理线程池是为了减少频繁的创建线程和销毁线程带来的性能损耗线程池分为核心线程池线程池的最大容量还有等待任务的队列提交一个任务如果核心线程没有满就创建核心线程执行如果满了就是会加入等待队列如果等待队列满了判断是否达到最大线程数量若没有就会创建空闲线程执行如果都达到最大线程数量就会按照丢弃策略进行处理。线程池的参数有哪些corePoolSize线程池核心线程数量。maximumPoolSize限制了线程池能创建的最大线程总数包括核心keepAliveTime空闲时间当线程池中线程的数量大于corePoolSize并且某个线程的空闲时间超过了 keepAliveTime那么这个线程就会被销毁。unit空闲时间的单位。workQueue工作队列。threadFactory线程工厂。用来给线程取名字。handler拒绝策略。线程池工作队列满了有哪些拒接策略常用的四种拒绝策略包括CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy1.AbortPolicy直接抛出异常默认策略2.CallerRunsPolicy用调用者所在的线程来执行任务3.DiscardOldestPolicy丢弃阻塞队列中靠最前的任务并执行当前任务4.DiscardPolicy直接丢弃任务有线程池参数设置的经验吗参考回答① 高并发、任务执行时间短 -- CPU核数1 减少线程上下文的切换② 并发不高、任务执行时间长IO密集型的任务 -- (CPU核数 * 2 1)计算密集型任务 -- CPU核数1 ③ 并发高、业务执行时间长解决这种类型任务的关键不在于线程池而在于整体架构的设计看看这些业务里面某些数据是否能做缓存是第一步增加服务器是第二步至于线程池的设置设置参考2核心线程数设置为0可不可以可以当核心线程数为0的时候会创建一个非核心线程进行执行。当核心线程数为 0 时来了一个任务之后会先将任务添加到任务队列同时也会判断当前工作的线程数是否为 0如果为 0则会创建空闲线程来执行任务。线程池种类有哪些参考回答在jdk中默认提供了4种方式创建线程池第一个是newCachedThreadPool创建一个可缓存线程池如果线程池长度超过处理需要可灵活回 收空闲线程若无可回收则新建线程。第二个是newFixedThreadPool 创建一个定长线程池可控制线程最大并发数超出的线程会在队列 中等待。第三个是newScheduledThreadPool可以执行延迟任务的线程池支持定时及周期性任务执行。第四个是newSingleThreadExecutor 创建一个单线程化的线程池单例的线程池它只会用唯一的工作线程来执行任 务保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。线程池一般是怎么用的资源风险应该手动 new ThreadPoolExecutor 来创建线程池Executors的快捷方法如newFixedThreadPool的无界队列、newCachedThreadPool的无限扩线程易导致内存溢出OOM可控性手动new ThreadPoolExecutor可自定义核心参数核心/最大线程数、有界队列、拒绝策略适配业务场景可观测性需为线程池命名方便排查问题建议监控队列积压、线程数膨胀等状态提前预警风险。线程池中shutdown ()shutdownNow()这两个方法有什么作用shutdown()置SHUTDOWN状态执行中任务继续不再接受新任务加任务会抛RejectedExecutionException。shutdownNow()置STOP状态中断所有正在执行的线程用Thread.interrupt()丢弃队列待执行任务并返回未执行任务列表但因线程可能不响应中断如无sleep/wait未必立即退出。提交给线程池中的任务可以被撤回吗提交给线程池的任务可以撤回核心通过Future.cancel(boolean mayInterruptIfRunning)实现未开始的任务直接取消不会执行正在执行的任务若mayInterruptIfRunningtrue调用Thread.interrupt()尝试中断需任务响应中断如含sleep()/wait()否则无法停止若mayInterruptIfRunningfalse不中断任务继续执行完已完成的任务取消无效。场景多线程打印奇偶数怎么控制打印的顺序利用wait()和notify()来控制线程的执行顺序。public class PrintOddEven { private static final Object lock new Object(); private static int count 1; private static final int MAX_COUNT 10; public static void main(String[] args) { Runnable printOdd () - { synchronized (lock) { while (count MAX_COUNT) { if (count % 2 ! 0) { System.out.println(Thread.currentThread().getName() : count); lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }; Runnable printEven () - { synchronized (lock) { while (count MAX_COUNT) { if (count % 2 0) { System.out.println(Thread.currentThread().getName() : count); lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }; Thread oddThread new Thread(printOdd, OddThread); Thread evenThread new Thread(printEven, EvenThread); oddThread.start(); evenThread.start(); } }单例模型既然已经用了synchronized为什么还要在加volatilepublic class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }volatile 确保了对象引用的可见性和创建过程的有序性避免了由于指令重排序而导致的错误。instance new Singleton(); 这行代码并不是一个原子操作它实际上可以分解为以下几个步骤• 分配内存空间。• 实例化对象。• 将对象引用赋值给 instance。没有 volatile 的情况下可能会出现重排序例如先将对象引用赋值给 instance但对象的实例化操作尚未完成。这样其他线程在检查 instance null 时会认为单例已经创建从而得到一个未完全初始化的对象导致错误。3个线程并发执行1个线程等待这三个线程全部执行完在执行怎么实现可以使用 CountDownLatch 来实现 3 个线程并发执行另一个线程等待这三个线程全部执行完再执行的需求。以下是具体的实现步骤• 创建一个 CountDownLatch 对象并将计数器初始化为 3因为有 3 个线程需要等待。• 创建 3 个并发执行的线程在每个线程的任务结束时调用 countDown 方法将计数器减 1。• 创建第 4 个线程使用 await 方法等待计数器为 0即等待其他 3 个线程完成任务。import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) { // 创建一个 CountDownLatch初始计数为 3 CountDownLatch latch new CountDownLatch(3); // 创建并启动 3 个并发线程 for (int i 0; i 3; i) { final int threadNumber i 1; new Thread(() - { try { System.out.println(Thread threadNumber is working.); // 模拟线程执行任务 Thread.sleep((long) (Math.random() * 1000)); System.out.println(Thread threadNumber has finished.); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 任务完成后计数器减 1 latch.countDown(); } }).start(); } // 创建并启动第 4 个线程等待其他 3 个线程完成 new Thread(() - { try { System.out.println(Waiting for other threads to finish.); // 等待计数器为 0 latch.await(); System.out.println(All threads have finished, this thread starts to work.); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }假设两个线程并发读写同一个整型变量初始值为零每个线程加 50 次结果可能是什么在没有任何同步机制的情况下两个线程并发对同一个整型变量进行 50 次加 1 操作最终结果可能是 100也可能小于 100最坏的结果是 50也就是最终的结果可能是在 [50, 100] 。小于 100 情况的分析由于对整型变量的 num 操作不是原子操作它实际上包含了三个步骤读取变量的值、将值加 1、将新值写回变量。在多线程环境下可能会出现线程安全问题。例如线程 1 和线程 2 同时读取了变量的当前值然后各自将其加 1最后都将相同的新值写回变量这就导致了一次加 1 操作的丢失。这种情况会多次发生最终结果就会小于 100。import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerAddition { private static AtomicInteger num new AtomicInteger(0); public static void main(String[] args) throws InterruptedException { Thread thread1 new Thread(() - { for (int i 0; i 50; i) { num.incrementAndGet(); } }); Thread thread2 new Thread(() - { for (int i 0; i 50; i) { num.incrementAndGet(); } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(最终结果: num.get()); } }解决方式通过 synchronized 关键字或 ReentrantLock 确保操作的互斥性。

相关文章:

Java 并发编程封神!从入门到精通,面试再也不怕被问爆

目录 synchronized 支持重入吗?如何实现的? syncronized锁升级的过程讲一下 JVM对Synchornized的优化? 介绍一下AQS CAS 和 AQS 有什么关系? 如何用 AQS 实现一个可重入的公平锁? Threadlocal作用,原理&#x…...

(论文速读)AFSS :防遗忘采样策略

论文题目:Does YOLO Really Need to See Every Training Image in Every Epoch?(YOLO真的需要查看每个epoch的每个训练图像吗?)会议:CVPR2026摘要:YOLO检测器以其快速的推理速度而闻名,但是训练它们仍然非…...

零基础玩转CentOS:快马AI生成新手友好型系统管理教程

作为一个Linux新手,第一次接触CentOS系统确实有点手足无措。记得我刚安装完CentOS 8最小化系统时,面对那个黑乎乎的终端界面,完全不知道从哪里开始配置。好在最近发现了InsCode(快马)平台,它生成的CentOS入门教程特别适合我这样的…...

go语言里面实现并发安全扣减库存的几种方式

一、基本数据准备 1、数据表的创建 -- ---------------- -- 库存表 -- ---------------- DROP TABLE IF EXISTS inventory; CREATE TABLE inventory (id int NOT NULL AUTO_INCREMENT primary key COMMENT 主键id,goods_id int(11) default 1 comment 商品id,stocks int(11) de…...

基于RetinaFace的课堂考勤系统:人脸识别与数据分析

基于RetinaFace的课堂考勤系统:人脸识别与数据分析 1. 为什么传统点名方式正在被智能考勤替代 早上八点的教室里,老师站在讲台前翻着花名册,学生低头刷手机,后排有人悄悄把书包放在空座位上——这种场景在高校和职业院校并不少见…...

贾子科学定理(Kucius Science Theorem)的哲学批判与理论重构:从证伪主义到可持续运行的科学范式研究

贾子科学定理(Kucius Science Theorem)的哲学批判与理论重构:从证伪主义到可持续运行的科学范式研究1. 引言1.1 研究背景与问题提出当代科学哲学正处于深刻的范式转换期。传统的波普尔证伪主义面临着前所未有的理论困境和实践挑战&#xff0c…...

终端设备可靠性检测报告:读懂设备耐用密码

日常使用手机、智能手表、家用路由器等终端设备时,我们总希望它“扛造耐用”,不轻易出故障。这份终端设备可靠性检测报告,就用通俗的话拆解设备耐用的核心密码,让大家明白,一台靠谱的设备,背后都经过了哪些…...

HsMod:55+创新功能重新定义炉石传说体验

HsMod:55创新功能重新定义炉石传说体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 🌟 项目核心价值概述 HsMod作为基于BepInEx框架的炉石传说模改插件&#xf…...

统计数据时,sql执行超时,如何处理

在工作中,除了开发,有时还需要做一些数据统计。 统计数据时,sql执行超时。 可以通过以下手段处理。 一、优化sql 首先,通过 EXPLAIN 查看执行计划,看有没有走索引,能加索引的加索引,没有走索引…...

windows系统部署funrec项目:安装WSL2

注意:WSL系统与Windows系统环境是完全隔离开的,只有代码文件可以互通 windows的anaconda、python、uv、torch、tensorflow等,WSL都不能用,都需要另外安装 WSL 可以访问 Windows 的项目文件(比如 /mnt/d/MyProject/……...

突破性方案:智能引擎助力黑苹果EFI自动生成

突破性方案:智能引擎助力黑苹果EFI自动生成 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾在深夜对着满屏的ACPI补丁代码感到迷茫…...

C++ 子数组位运算结果 题型

或运算 898. 子数组按位或操作 - 力扣(LeetCode) 我们直接看题,意思很明显,就是找出所有子数组,然后将子数组各个数相或得到的结果有多少个不同。 这里我们首先想到的就是直接把所有子数组求出来在或起来&#xff0c…...

网站SEO推广需要多少钱_如何选择合适的网站 SEO 推广服务商

网站SEO推广需要多少钱_如何选择合适的网站 SEO 推广服务商 一、了解网站SEO推广的基本概念 在当今的数字时代,网站SEO推广(Search Engine Optimization,搜索引擎优化)已成为任何企业在互联网上获得流量和客户的关键手段之一。S…...

基于下垂控制的光储直流微电网模型 1.模型由光伏和储能以及直流负载组成 2.光伏采用扰动观测法...

基于下垂控制的光储直流微电网模型1.模型由光伏和储能以及直流负载组成 2.光伏采用扰动观测法实现最大功率输出,储能刚开始采用恒定电压控制,电压稳定在额定电压附近,2s之后采用下垂控制,母线电压降低,达到目标光伏板在…...

如何处理Java LocalDateTime与Oracle TIMESTAMP WITH TIME ZONE的时区对应

根本原因是LocalDateTime无时区信息,JDBC驱动按JVM时区(如Asia/Shanghai)将其解释为带偏移时间点;存UTC时间须用localDateTime.atZone(ZoneOffset.UTC).toOffsetDateTime()显式指定偏移。Oracle插入时TIMESTAMP WITH TIME ZONE字段…...

CSS移动端解决阴影遮挡效果_利用box-shadow设置外扩散距离

box-shadow外扩散失效主因是父容器overflow隐藏、层叠上下文触发或参数误设;需检查overflow/transform/filter影响,用translateZ(0)强制分层,伪元素移出阴影,合理组合inset与外扩,并控制扩散距离≤8px。box-shadow 外扩…...

实现鼠标滚轮在容器滚动到底部后无缝过渡到页面滚动

本文介绍如何通过 javascript 检测固定高度溢出容器的滚动边界,在用户滚至底部时立即触发页面滚动,消除原生行为中约1秒的延迟等待,实现平滑、无中断的滚动接力。 本文介绍如何通过 javascript 检测固定高度溢出容器的滚动边界&#xff…...

IndexTTS 2.0应用案例:如何用它快速生成有声书和播客内容

IndexTTS 2.0应用案例:如何用它快速生成有声书和播客内容 1. 引言:声音创作的新范式 在数字内容爆炸式增长的今天,有声书和播客市场正以每年20%以上的速度扩张。但高质量音频内容的制作却面临两大痛点:专业配音成本高昂&#xf…...

[具身智能-218]:针对不同编程语言和应用场景,AI自动编程擅长与不擅长之处?

AI自动编程的能力在不同编程语言和应用场景下表现出显著差异。选择合适组合,能让AI成为强大的“加速器”,反之则可能带来风险。 核心原则是:AI对主流语言和标准化任务的支持最好,而在处理底层、高性能或复杂业务逻辑时则需要人工…...

细说杨乃武与小白菜案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、案件二、精神分析学---心理防御机制三、关于我自己总结前言 一、案件 略,后面补 二、精神分析学—心理防御机制 在这个案件我主要关注县令和小…...

5个步骤搭建P2P视频分发系统:PCDN实战指南

5个步骤搭建P2P视频分发系统:PCDN实战指南 【免费下载链接】PCDN PCDN is an Peer to peer CDN for video, its Hybrid CDN/P2P Architecture. HTTP Live Streaming, WebRTC, videojs and peerjs, HLS and Video for broadcasts 项目地址: https://gitcode.com/g…...

DDrawCompat:让经典软件重获新生的兼容性解决方案

DDrawCompat:让经典软件重获新生的兼容性解决方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDrawCompa…...

数字化转型架构下的数据安全治理指南:以数据安全为核心的安全立体防御体系、数据安全体系、数据安全现状评估报告···(附相关资料)

微信公众号:木木自由,更多数据分析,经营分析、财务分析、商业分析、数据治理、数据要素、数据资产干货以及资料分享木木自由 数据分析领地Digital Technology Summit在数字经济深度发展的今天,数字化转型已成为企业生存与发展的…...

C语言完美演绎6-21

/* 范例&#xff1a;6-21 */#include<stdio.h> #include<conio.h>int main(){int n;printf("这是nn乘法表&#xff0c;请输入一值>");scanf("%d",&n);int i1;for(;i<n;) /* i从1到n次循环*/{int j1;for(;j<n;) /…...

c语言完美演绎6-20

/* 范例&#xff1a;6-20 */#include<stdio.h> #include<conio.h>int main(){int a;printf("请输入你的分数0-100>");scanf("%d",&a);if((a>0) && (a<60))printf("你被当了");else if((a>60) && (a…...

seo关键词挖掘工具哪个好_seo数据分析工具哪个最强

选择最佳SEO关键词挖掘工具和SEO数据分析工具指南 SEO关键词挖掘工具哪个好 在当今数字营销的竞争激烈环境中&#xff0c;选择合适的SEO关键词挖掘工具至关重要。这不仅能帮助你找到最相关、最受欢迎的关键词&#xff0c;还能显著提升你的网站流量和搜索引擎排名。市面上哪些…...

Unity游戏插件加载器MelonLoader完全指南:从安装到精通

Unity游戏插件加载器MelonLoader完全指南&#xff1a;从安装到精通 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 在Unity游戏…...

Godot 4 2D 物理引擎位置初始化踩坑:add_child() 和 position 到底谁先? (错误位置触发物理事件)

Godot 4 2D 物理引擎位置初始化踩坑&#xff1a;add_child() 和 position 到底谁先&#xff1f; 在 Godot 4 做 2D 游戏时&#xff0c;很多人都会遇到一个很诡异的问题&#xff1a; 我明明想把一个 PackedScene 实例生成在 B 点&#xff0c;结果它却会在默认位置 A 点 短暂触发…...

实战演练:基于快马平台与方锐理念构建短视频智能配乐应用

最近在做一个短视频创作的小工具&#xff0c;发现给视频配乐真是个技术活。正好看到网易方锐的AI音乐技术挺火的&#xff0c;就想着能不能用它的理念做个智能配乐助手。在InsCode(快马)平台上试了试&#xff0c;没想到还真搞出了一个能跑起来的demo&#xff0c;分享下我的实现思…...

Project AirSim避障实战:深度图分割与动态航向规划详解

1. 深度图避障的核心原理 深度图避障是无人机自主导航中最基础也最关键的环节之一。简单来说&#xff0c;它就像给无人机装上了一双能精确测距的"眼睛"。这双眼睛看到的不是普通照片&#xff0c;而是一张每个像素都带有距离信息的特殊图像——我们称之为深度图&#…...