Java多线程基础问题

1. 为什么要使用多线程?
(1)更多的处理器核心
一个单线程程序在运行时只能使用一个处理器核心,那么再多的处理器核心加入也无法显著该程序的执行效率。相反,如果该程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变得更有效率。
(2)更快的响应时间
可以使用多线程技术,将数据一致性不强的操作派发给其他线程处理(也可以使用消息队列)。这样做的好处是响应用户请求的线程能够尽可能快地处理完成,缩短响应时间,提升用户体验。
(3)更好的编程模型
Java为多线程编程提供了良好、考究并且一致的编程模型,当开发人员为所遇到的问题建立合适的模型之后,稍作修改就能够方便地映射到Java提供的多线程编程模型上。

2. 什么是上下文切换?
当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

3. sleep() 方法和 wait() 方法区别和共同点?
Sleep()方法和wait()方法都用来改变线程的状态,能够让线程从运行状态,转变为休眠状态。
sleep()方法必须传入参数,参数就是休眠时间,时间到了就会自动醒来。wait()方法可以传入参数也可以不传入参数,传入参数就是在参数结束的时间后开始等待,不传入参数就是直接等待。

  • 调用sleep()方法和带有参数的wait()方法,都会让线程状态从RUNNABLE(可运行状态),变为TIMED_WATING
  • 调用无参的wait()方法,会让线程状态从RUNNABLE(可运行状态)变为WATING
  • 任何线程都可以调用sleep()方法进入休眠状态,但是只有获取synchronized锁的线程(同步方法或者同步代码块中),才能调用wait()方法
  • wait()方法主要用于等待/通知机制,通过调用notify()和notifyAll()让线程状态转变为RUNNABLE, wait(long timeout)超时后线程也会自动苏醒。sleep() 方法执行完成后,线程会自动苏醒。
  • 一个线程对象调用了sleep()之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。

4. 为什么我们不能直接调用 run() 方法,而要调用 start() 方法?
new 一个 Thread,线程进入了新建状态。调用 start() ,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() ,会把 run()当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

5. synchronized 关键字的理解
synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。

synchronized关键字最主要的三种使用方式:

  • 修饰实例方法,作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁
  • 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁)。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。
  • 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。 和 synchronized 方法一样,synchronized(this)代码块也是锁定当前对象的。synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。这里再提一下:synchronized关键字加到非 static 静态方法上是给对象实例上锁。另外需要注意的是:尽量不要使用 synchronized(String a) 因为在JVM中,字符串常量池具有缓冲功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值