当前位置:萝卜系统 > 硬件软件教程 > 详细页面

1. 面向对象与面向过程之间的区别:

1. 面向对象与面向过程之间的区别:

更新时间:2023-06-21 文章作者:未知 信息来源:网络 阅读次数:

根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。

java避免死锁_java多线程避免死锁_java多线程避免死锁

常见异常

数组脚本越界(ArrayIndexOutOfBoundsException)

NullPointerException(NullPointerException)

ClassCastException(ClassCastException)

使用临时关键字修改.

瞬时关键字的作用是防止实例中由该关键字修改的变量的序列化;反序列化对象时,瞬态修改变量的值将不会保留和恢复. 瞬态只能修改变量,不能修改类和方法

BIO正在阻止IO,就像开水一样. 他必须先将第一锅水煮沸,然后再将第二锅水煮沸,然后再进行下一锅. 会消耗很多时间. NIO是非阻塞IO. 您可以同时煮三锅水. 他需要经常走来走去,观察每壶水是否在沸腾. 在煮沸过程中别无他法. AIO异步IO是向每个锅中加水煮沸的计时器开关. 稍后我们会通知我们,我们可以在煮沸过程中做其他事情

final关键字主要在三个地方使用: 变量,方法和类.

static关键字主要具有以下四种使用场景

修改成员变量和成员方法

静态代码块

静态内部类

静态指南包

静态方法和非静态方法

静态{}静态代码块和{}非静态代码块(构造代码块)

此关键字用于引用该类的当前实例

super关键字用于从子类访问父类的变量和方法

冒泡,二分法

&&和&都表示AND,不同之处在于,只要&&的一个条件不同,就不能满足. 如果不满足第一个条件,则不判断以下条件. 并且&必须判断所有条件

||和都表示“或”,区别是||只要满足第一个条件,就不会判断以下条件,并且|必须判断所有条件

BigDecimal由任意精度的整数无标度值和32位整数标度(标度)组成

BigDecimal在银行,帐户,帐单等领域提供准确的数值计算

List,Set,Map都是接口,前两个继承自Collection接口,Map是独立接口

Set下有HashSet,LinkedHashSet,TreeSet

列表下有ArrayList,Vector,LinkedList

Map下有Hashtable,LinkedHashMap,HashMap,TreeMap

在Collection接口下还有一个Queue接口,它具有PriorityQueue类

列表是有序且可重复的

ArrayList

优点: 底层数据结构是一个数组,可以快速查询,而添加或删除则很慢.

缺点: 线程不安全高效

java多线程避免死锁_java避免死锁_java多线程避免死锁

向量

优点: 底层数据结构是一个数组,可以快速查询,而添加或删除则很慢.

缺点: 线程安全,效率低

LinkedList

优点: 底层数据结构是一个链表,查询慢,添加和删除快.

缺点: 线程不安全高效

-设置无序,唯一

HashSet

如何确保元素的唯一性?

基础数据结构是哈希表. (无序,唯一)

1. 依靠两种方法: hashCode()和equals()

LinkedHashSet

底层数据结构是链表和哈希表. (按顺序插入FIFO,唯一)

1. 元素的顺序由链表保证

2. 哈希表保证了唯一元素

TreeSet

基础数据结构是一棵红黑树. (唯一,有序)

1. 如何确保元素的排序?

自然排序

比较器排序

2. 如何确保元素的唯一性?

根据比较的返回值是否为0来确定.

1.public void init(ServletConfig config)执行时间: 创建Servlet对象时将调用此方法

2. public void service(ServletRequest请求,ServletResponse响应)执行时间: 将为每个请求执行此方法;这种方法通常用于业务逻辑处理

3. 公共void destroy()执行时间: 销毁Servlet对象(关闭服务器)时执行此方法

JSP和Servlet之间是什么关系? JSP本质上是Servlet的一种简单形式. 服务器将JSP处理成与Servlet类似的Java程序. 有人说Servlet用Java编写HTML,而JSP用HTML编写Java代码编写,当然,这种说法是单方面的,不够准确. JSP专注于视图,Servlet更多关注于控制逻辑,在MVC架构模式中,JSP适合于视图(视图),而Servlet适合于控制器(控制器).

1. 客户端发送一个请求,该请求是JSP,Web容器将找到相应的servlet进行处理

2. 将servlet转换为字节码文件

3. 将字节码文件加载到Web容器中

4. 此时,将在Web容器中创建一个实例

5. 初始化

java多线程避免死锁_java避免死锁_java多线程避免死锁

6. 通过服务接受请求

7. 然后,Web容器将自动生成两个对象servlet和service,最后将其销毁

request: 封装客户端的请求,其中包含来自GET或POST请求的参数;

响应: 封装服务器对客户端的响应;

pageContext: 其他对象可以通过此对象获得;

session: 封装用户会话的对象;

out: 输出服务器响应的输出流对象;

exception: 封装页面引发的异常的对象.

page: JSP页面本身(相当于Java程序中的页面);

config: Web应用程序配置对象;

应用程序: 封装服务器操作环境的对象;

jsp: include: 在请求页面时包含文件.

jsp: useBean: 查找或实例化JavaBean.

jsp: setProperty: 设置JavaBean的属性.

jsp: getProperty: 输出JavaBean的属性.

jsp: forward: 将请求转发到新页面.

jsp: plugin: 根据浏览器类型为Java插件生成OBJECT或EMBED标签

jsp: param(传递参数)

pagez命令

include指令

taglib指令

页面,请求,会话和应用程序

1. ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构.

2. 对于随机访问获取和设置,ArrayList感觉比LinkedList更好,因为LinkedList需要移动指针.

3. 对于添加和删除操作,LinedList更具优势,因为ArrayList需要移动数据.

摘要: 最好添加和删除LinedList,最好是找到ArrayList.

Vector类的所有方法都已同步. 两个线程可以安全地访问Vector对象,但是如果一个线程访问Vector,则代码将花费大量时间进行同步操作.

Arraylist不同步,因此建议在不需要线程安全的情况下使用Arraylist

可比的接口实际上来自java.lang包. 它具有用于排序的compareTo(Object obj)方法

比较器接口实际上来自java.util包. 它具有用于进行排序的compare(Object obj1,Object obj2)方法.

ist是一个有序列表,允许重复的元素并允许为空

java多线程避免死锁_java多线程避免死锁_java避免死锁

Set是一个无序列表,不允许重复的元素,该元素的位置由hashCode确定,并且最多包含一个null

list和set是用于存储单列数据的集合,而Map是用于存储双列数据(例如键值对)的集合

地图存储结构不正确,键不能重复,值可以重复,并且哈希图可以具有空键

该进程具有独立的地址空间. 进程崩溃后,它不会影响处于保护模式的其他进程,线程只是进程中不同的执行路径. 线程具有自己的堆栈和局部变量,但是线程之间没有单独的地址空间. 线程的死亡意味着整个过程的死亡. 因此,多进程程序比多线程程序更健壮,但是在多个进程之间切换时,它的成本更高. 资源较大,效率较差. 但是对于某些需要同时执行并共享某些变量的并发操作,只能使用线程,而不能使用进程.

进程是资源分配的最小单位,线程是CPU调度的最小单位

程序中至少有一个进程,一个进程中至少有一个线程;线程的划分规模小于进程的划分规模(占用资源),这使得多线程程序具有较高的并发性. 进程在运行期间具有独立的内存空间,并且内存程之间共享,这大大提高了程序的效率. 线程不能独立运行,并且必须存在于进程中.

优缺点: 线程开销很小,但不利于资源管理和保护,而过程相反.

在Java中,在给定的时间点,线程只能处于一种状态. 上图中的状态是所有虚拟机状态,而不是操作系统的线程状态. 线程对象的状态存储在Thread类的内部类(状态)中,该内部类是一个枚举,并且有六个固定状态: NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED.

上下文切换是指CPU上的内核(操作系统的核心)的进程或线程切换. 上下文切换过程中的信息存储在过程控制块(PCB-Process Control Block)中. PCB也称为SwitchFrame(SwitchFrame). 上下文切换信息将始终存储在CPU内存中,直到再次使用为止.

当两个线程互相等待释放资源时,就会发生死锁.

造成僵局的主要原因是

由于系统资源不足

进程运行的顺序不合适

资源分配不当等??

僵局的四个必要条件

(1)互斥条件: 资源一次只能由一个进程使用

(2)请求和保持条件: 当一个进程被请求资源阻塞时,它将保留所获取的资源.

(3)非剥夺条件: 进程已获取的资源在用尽之前不能被强行剥夺.

(4)循环等待条件: 多个进程之间形成一种循环等待资源关系.

两者都可以中止线程的执行.

两者之间的主要区别在于,sleep方法不会释放锁,而wait方法会释放锁.

等待通常用于线程之间的交互/通信,而睡眠通常用于挂起执行.

调用wait()方法后,该线程将不会自动唤醒,其他线程需要在同一对象上调用notify()或notifyAll()方法. 执行sleep()方法后,线程将自动唤醒. 或者,您可以使用wait(长时间超时)在超时后自动唤醒线程.

为什么在调用start()方法时执行run()方法,为什么不能直接调用run()方法?

新建一个线程,该线程进入新状态;调用start()方法将启动一个线程并使该线程进入就绪状态,并且可以在分配时间片后开始运行. start()将执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作. 通过直接执行run()方法,run方法将在主线程下作为普通方法执行,并且不会程中执行,因此这不是多线程工作.

摘要: 调用start方法以启动线程并使线程进入就绪状态,而run方法只是线程的常规方法调用java多线程避免死锁,或者在主线程中执行.

①都是可重入锁

两者都是可重入锁. “可重入锁”的概念是您可以再次获取自己的内部锁. 例如,线程已获取对象的锁,而对象锁尚未释放. 当它想再次获取该对象的锁时,仍然可以获取它. 如果它是可解锁且可重入的,则将导致死锁. 每次同一线程获取一个锁时,锁计数器都会增加1,因此只有在锁计数器降至0时才能释放该锁.

②同步取决于JVM,而ReentrantLock取决于API

已同步是由JVM实现的. 前面我们还提到了虚拟机团队对JDK1.6中的synced关键字进行了很多优化,但是这些优化是在虚拟机级别实现的,并不直接暴露给我们. ReentrantLock是在JDK级别上实现的(也就是说,在API级别上,需要使用try / finally语句块来完成lock()和unlock()方法),因此我们可以查看其源代码以了解其方式已实现.

③ReentrantLock比同步功能增加了一些高级功能

java多线程避免死锁_java多线程避免死锁_java避免死锁

与同步相比,ReentrantLock添加了一些高级功能. 有以下三点: ①等待可以打断; ②可以实现公平锁定; ③可以实现选择性通知(锁可以绑定多个条件)

ReentrantLock提供了一种机制来中断等待锁定的线程. 该机制由lock.lockInterruptible()实现. 换句话说,等待线程可以选择放弃等待并转而处理其他事情.

ReentrantLock可以指定它是公平锁还是不公平锁. 而同步只能是不公平的锁定. 所谓的公平锁是首先获得锁的第一个等待线程. 默认情况下,ReentrantLock是不公平的. 您可以使用ReentrantLock类的ReentrantLock(布尔公平)构造方法来确定它是否公平.


本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-284713-1.html



温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html