每天几道java面试题

并行与并发的区别

并行

并行是指在***同一时刻***,多个任务==在不同的处理器上或者同一处理器的不同核心上同时执行==(也就是多个核心同时工作),这种方式是真正的同时执行,因为每个任务都拥有自己的处理资源,不需要等待其他任务完成。并行处理的目的是通过分解任务并行执行,来提高计算的速度和效率。就比如一个多核的处理器可以同时运行多个任务,每个任务在不同的核心上执行,从而实现真正的并行计算。

并发

并发是指在==同一时间段内==,多个任务交替执行,从外部观察这些任务是同时进行的。但是实际上,在微观层面上,这些任务并不是真正同时执行的,而是由于时间片轮转等机制,能够使得CPU能够快速地在不同任务之间切换,而给人一种同时执行的错觉。就比如在一个单核处理器上,操作系统可以通过快速切换任务的执行,让用户感觉多个任务在同时进行。这个快速切换的过程被称为上下文切换。(交替执行)

线程的状态

NEW(新建状态)

RUNNABLE(可运行,就绪状态)

RUNNING(运行状态,一般线程很快,抓不到该状态)

BLOCKED(阻塞状态)

WAITING(等待状态)

TIMED_WAITING(超时等待状态)

TERMINATED/DEAD(终止,即死亡状态)

Wait和Sleep的区别

①方法所属类

wait()是Object类的方法,通常用于实现线程间的同步和等待。

sleep()是Thread类的一个静态方法,用于让当前正在执行的线程暂停指定的时间。

②锁释放

wait方法在调用时会释放锁

sleep方法在调用时不会释放任何锁资源,通常是抱着锁睡。

③如何唤醒

wait方法需要手动唤醒,notify或notifyAll

sleep方法自己到点了会自己苏醒。

④使用场景

wait方法主要用于线程间的通信和同步,等待某个条件的发生或者资源的可用。通常用于线程间的协调,需要释放锁并等待某个条件的发生

sleep方法主要用于暂停当前线程的执行一段时间,通常会用在简单的延迟或者降低CPU使用率。

Juc提供了哪些原子类

Atominclnteger

get():获得当前值。

set(int newValue):设置当前值。

incrementAndGet():原子的将当前的值加1并返回结果。

decrementAndGet():原子的将当前的值减1并返回结果。

addAndGet(int delta):原子的将当前的值加上指定的值并返回结果。

getAndIncrement():原子的将当前的值加1并返回原来的值。

getAndDecrement():原子的将当前的值减1并返回原来的值。

getAndAdd(int delta):原子的将当前的值加上指定的值并返回原来的值。

compareAndSet(int expect,int update):如果当前值等于预期值,则原子的将当前的值设置为更新值否则返回false。

AtomicLong

AtomicLong与AtomicInteger类似,但处理的是64位的长整型值。

AtomicBoolean

AtomicBoolean是一个布尔型的原子类,提供了线程安全的布尔值更新。

Juc包常用的辅助类

同步辅助类:Semaphore(信号量),CountDownLatch(倒计时锁存器),CyclicBarrier(循环屏障)它们都可以用来协调多线程之间的执行。

Semaphore:信号量,用于控制同时访问某个资源的线程量,线程可以通过调用acquire()来获得信号量的许可,当信号量中有可用的许可时,线程就可以获得该许可;否则线程必须等待,直到有可用的许可。线程可以通过release()来释放它所持有的信号量许可。

CountDownLatch:倒计时锁存器,可以让一个或者多个线程等待其他线程完成某些操作。类似一个倒计时,当计数器变为0,就释放所有等待的线程。

CyclicBairrer:可以让多个线程相互等待,直到所有线程都到达屏障点后才继续执行,当线程调用await方法时,它们都会被阻塞,直到所有线程都调用await()方法后才会一起执行。

Semaphore适用于一个线程需要等待获取许可证才能访问共享

CountDownLatch适用于一个线程等待多个线程完成操作的情况。

CyclicBairrer适用于多个线程在同一个屏障处等待。

synchronized在静态资源和非静态资源分别锁是什么?

非静态资源

当synchronized用于非静态方法或者非静态代码块时,锁住的时当前对象的实例锁。

这意味着如果两个线程试图同时访问同一个实例的不同同步方法或同步代码,那么只有一个线程可以执行。

静态资源

当synchronized用于静态方法或静态代码块时,锁住的是类(即class对象)

这意味着如果两个线程同时访问同一类的不同静态同步方法或静态同步代码块,那么只有一个线程可以执行。

Lock和synchronized的区别?

1.Lock是接口,synchronized是java中的关键字,是内置语言的实现,两个实现类都是悲观锁。

2.synchronized的锁是隐式获取和释放的,synchronized在发生异常时会自动释放线程占有的锁。而Lock的锁时显示获取和释放的。

3.Lock是可以公平也可以是不公平,这是可以选择的。

4.锁的范围:synchronized可以用于方法或代码块,Lock却只能应用于代码块

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值