多线程笔记

(笔者有些知识点可能存在理解局限性,或者有误区,希望各位看官多多包涵,欢迎留言,或纠正,大家互相学习互相共勉哈?)

 

1.什么是线程?

线程就是操作系统的运算调度的最小单位,它包含于进程中,而且是进程的实际运作单位;我们可以使用多线程来为运算密集型的任务提速,并且Java语言对多线程提供了良好的支持。

2.线程和进程有什么区别?

  • 线程是进程的实际运作单位,或者说是进程的子集;一个进程可以有多个线程,每个线程执行不同的任务。
  • 不同的进程拥有不同的内存空间,而所有的线程共享一片相同的内存空间;
  • 每个线程都拥有独立的栈内存来存储本地数据(本地数据:本地的变量、方法和栈的调用等)

3.怎么创建线程,或者怎么实现线程?优先选择那个方法?

创建线程可以通过:继承Thread类,或者实现runnable接口;

一般优先选择实现runnable接口,重写run()方法实现线程,因为Java不支持多重继承;

4. start()与run()方法的区别?

  • start()用来启动新的线程,它内部也有调用到run()方法;
  • 不一样的是,直接调用run()方法,是在原来的线程中调用,不启动新线程。

5.runnable与callable的区别?

首先,Runnable在JDK1.0版本的时候就有了,而Callable实在JDK1.5版本才新增进来的,其次是Callable的call()方法可以返回值和抛出异常,但是Runnable的run()方法没有这个功能;

还有,就是Callable可以返回装载有计算结果的future对象。

6.什么是负载均衡?

负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。

7.为什么要用线程?或者什么时候用到线程?

在系统或者系统开发中,遇到高并发或者并行的情况下为了解决负载均衡问题,就需要用到线程;并且,利用线程能有效提高CPU的利用率,充分利用cup的资源,(多线程)还可以解决负载均衡问题。

8.怎么理解线程安全?或者什么是线程安全?

多线程运行的情况下,并且同时执行一段代码,运行的结果与单线程运行的结果一样,就是线程安全的。

9.线程之间是如何通信的?或者线程之间的通信方式?

  • 使用全局变量通信,最好用volatile来修饰,保证线程对全局变量的改变,其他线程是可见的。
  • 使用消息通信,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。
  • 使用事件CEvent类实现线程间通信,Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。

10.进程之间的通信方式?

  • 管道
  • 消息队列
  • 共享内存
  • 套接字
  • 信号

11.线程间的同步方式?

  • 临界区
  • 互斥量
  • 信号量
  • 事件

12.怎么停止线程?或者中断线程?

Java的API没有停止线程的方法。JDK1.0的时候Java API的设计者其实是有提供了stop()、suspend()、resume()等方法,但太暴力了,会造成潜在死锁威胁,所以后续被放弃使用了,不过run()或者call()方法执行完之后,线程会自动结束;

如果需要手动结束的花,可以使用interrupt()方法,并且会产生一个中断标志。

13.怎么理解Java的内存模型?

Java内存模型(Java Memory Model ,JMM)规定和指定了Java程序在不同的内存架构、CPU和操作系统之间有确定性的行为,屏蔽了各种硬件和操作系统的访问差异,保证了Java程序在各种平台下对内存的访问能达到效果一致的机制及规范。还提供了一系列原语,封装了底层实现后,供开发者直接使用。

Java内存模型,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。

Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的本地内存,线程的本地内存中保存了主内存中共享变量的副本,线程对变量的所有操作都必须在本地内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方的本地内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

14.java竞态条件是什么?举个例子?

多线程对一些资源的竞争,首先要执行的程序竞争失败然后重新排队,导致整个流程没有按照预期的顺序执行,然后出现一些不确定的、很难发现的bug,这种情况就是竞态条件。例如无序处理。

15.Notify和NotifyAll的区别?

notify()是唤醒单个线程;notifyAll()是唤醒所有的线程,然后一起争夺锁,保证起码有一个线程在执行。

16.什么是死锁?造成死锁的因素(条件)是什么?怎么避免死锁?

  1. 死锁就是两个或两个以上的进程在执行时,竞争资源导致互相等待,程序卡死的现象。
  2. 主要是以下四个条件:互斥条件:就是一个资源只能有一个进程获取;请求和保持条件:进程在请求资源阻塞时,对已获得的资源保持不放;不剥夺条件:进对以获得的资源,还未使用完之前,是不会被强行剥夺的;循环等待条件:多个进程之间形成首尾相接等待资源释放的情况。
  3. 避免死锁的方法就是防止循环等待条件,对系统中的资源都设置标志位和排序,规定所有的进程申请资源的时候都按照顺序执行。(升序或降序)

17.什么是活锁?

活锁指的是进程没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

18.死锁与活锁的区别?

死锁是进程的状态无法改变,也无法执行;

活锁是进程状态可以改变,但是也无法执行。

转载于:https://www.cnblogs.com/4AMLJW/p/sdiusup.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值