自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 收藏
  • 关注

原创 说一下 JSONP 实现原理?

需要注意的是,JSONP只支持GET请求,不支持POST请求,且存在一定的安全风险,需要确保目标服务器可信并且返回的数据是可靠的。另外,在使用JSONP时,需要与目标服务器进行约定,确保前后端的回调函数名称一致,以便正确获取返回的数据。关键点是,由于浏览器对于`<script>`标签的请求不受同源策略的限制,因此可以通过动态创建`<script>`标签实现跨域请求。2. 目标服务器在接收到请求后,将要返回的数据包裹在一个指定的回调函数中,并将整个函数作为响应返回给前端页面。

2023-09-27 11:28:49 176

原创 如何实现跨域请求?

2. CORS(Cross-Origin Resource Sharing):服务端通过设置响应头中的`Access-Control-Allow-Origin`字段允许指定源(域名、协议和端口)的跨域请求。服务器端返回的数据需要包裹在一个指定的回调函数中,前端将回调函数作为参数传入,并在响应中执行该回调函数,从而获取到数据。3. 代理服务器:设置一个代理服务器,将前端请求发送到同一域名下的后端服务器,再由后端服务器转发到目标服务器,最后将响应返回给前端。同时也要考虑安全性和风险,避免产生安全漏洞。

2023-09-27 11:27:58 197

原创 get 和 post 请求有哪些区别?

1. GET 请求将数据附加在 URL 的末尾,而 POST 请求将数据放置在请求的消息体中。由于数据在 URL 中可见,GET 请求对于传递敏感信息不是安全的,而 POST 请求将数据放在消息体中更为安全。4. GET 请求的参数会附加在 URL 的末尾,对于传递的数据量有限制,而 POST 请求的参数放在消息体中,对于传递的数据量没有限制。

2023-09-27 11:26:03 346

原创 OSI 的七层模型都有哪些?

2. 数据链路层(Data Link Layer):提供对物理层的透明传输,将原始比特流转换为数据帧,并提供点对点的可靠传输。4. 传输层(Transport Layer):提供端到端的可靠或不可靠传输,在网络中的不同主机之间建立可靠的数据传输连接。5. 会话层(Session Layer):负责建立、管理和终止会话(通信会话),包括对数据流的同步和数据扩展。3. 网络层(Network Layer):负责在不同网络之间进行路由选择和分组转发,实现数据包的跨网络传输。

2023-06-29 10:21:19 323

原创 OSI 的七层模型都有哪些?

7. 应用层(Application Layer):主要负责处理用户与网络之间的接口,定义了各种协议和应用程序(例如电子邮件、Web、FTP等),提供给用户的应用程序通过应用层与网络层进行交互。4. 传输层(Transport Layer):主要负责定义两台主机之间通信的服务和规则,保证数据传输的可靠性,如TCP和UDP协议。3. 网络层(Network Layer):主要负责处理点到点之间的数据传输,实现网络的拓扑结构和路由选择等功能,如IP协议。

2023-06-27 22:26:50 393

原创 tcp 粘包是怎么产生的?

4. 更复杂的是多个应用程序利用相同的TCP连接并发发送数据,因为TCP本身是流式协议,无法识别边界,所以多个应用程序同时发送数据包到同一个Socket连接上时,这些数据包有可能在接收端粘连在一起,形成一个数据包。TCP粘包是指在传输过程中多个小数据包粘在一起,形成一个大数据包传输的现象。3. 通过虚拟通道传输数据,但通道并没有提供消息边界保护的机制,导致多个数据包合并成一个数据包发送。2. 接收方缓冲区大小设置不合理,导致多个小数据包粘在一起传输,形成一个大数据包发送。

2023-06-27 22:25:54 458

原创 tcp 为什么要三次握手,两次不行吗?为什么?

如果使用两次握手,可能会导致双方数据包的混淆。1. 客户端(发送方)向服务端(接收方)发送一个SYN(Synchronize)包,表示请求建立连接,此包包含客户端选择的随机初始序列号。2. 服务端接收到客户端发来的SYN包后,回复一个SYN+ACK的包,表示确认客户端的请求并且传达服务端的初始序列号。2. 如果服务端发出SYN+ACK包但在传输中丢失了,客户端不知道服务端是否同意连接,会重复发送SYN包。3. 客户端接收到服务端发来的SYN+ACK包后,再回复一个ACK包,表示确认服务端的请求。

2023-06-27 22:25:01 165

原创 抽象类能使用 final 修饰吗?

抽象类不能使用 final 修饰符,因为这两者的设计目的是相互矛盾的。抽象类是为了被继承和实现而存在的,使用 final 修饰符就不能被继承了。而 final 类则是为了不被继承而存在的。因此,如果一个类被声明为抽象类,就表明它是被设计成可以被其他类继承和实现的,不能使用 final 修饰符。

2023-06-27 22:20:53 788

原创 简述 tcp 和 udp的区别?

它为每一次数据传输建立一个可靠连接,并且通过重传丢失的数据和检查数据是否正确到达确保数据传输的可靠性。而UDP则不需要建立连接,数据发送后无法得到接收方的确认和重传请求,因此可能会出现丢失数据和乱序的情况。综上所述,TCP通常用于可靠的数据传输,而UDP则用于实时传输。当应用需要可靠的数据传输时就选择TCP,而需要快速传输的数据时则选择UDP。TCP需要在通信双方保持连接的同时维护所有传输的信息,因此需要消耗较多的系统和网络资源。TCP在传输时,将需要传输的数据按照MTU分为多个小段,以便在网络中传输。

2023-06-16 08:56:32 91

原创 forward 和 redirect 的区别?

Redirect是通过URL重定向发送一个请求到浏览器,并由浏览器访问另一个URL,从而导致服务器接受来自浏览器的另一个传入请求。- Redirect是通过向浏览器发送HTTP响应来完成的,然后浏览器会重新向新的地址发送请求,发送请求需要时间,因此速度相对较慢。- Forward时, 客户端浏览器的URL不会改变,仍然是原来的URL,被请求的资源也不知道请求是由另一个资源来的。- Redirect是在客户端进行重定向,速度较慢,但可以更改浏览器的URL地址,同时可以跳出应用程序的上下文环境。

2023-06-16 08:53:44 144

原创 http 响应码 301 和 302 代表的是什么?有什么区别?

通常情况下,301状态码比302更常用,因为永久性重定向对于SEO和搜索引擎的优化更加友好,而且可以使浏览器和搜索引擎更好地缓存新的URL,从而提高性能和减少网络流量。但在某些情况下,临时性重定向也是非常有用的,例如负载均衡和应急维护等。- 302状态码表示暂时性重定向,意味着资源仍然可以被在原有的URL上访问,但是客户端应该在未来的请求中使用新的URL。- 301状态码表示永久性重定向,意味着资源已经被移动到了新的URL,未来所有的请求都应该使用新的URL。

2023-06-15 14:52:47 1324

原创 常见的异常类有哪些?

Checked Exception是指在代码中可能导致逻辑错误或问题需要进行处理的异常, 继承自 Exception 类,必须显式地进行处理以避免程序无法编译通过。Unchecked Exception是指由程序错误引起的运行时异常,不需要编写处理程序,仅需要防止代码写入可能导致异常的代码即可。常见的异常类主要分为两类:Checked Exception和 Unchecked Exception。6. RuntimeException:表示Java中所有运行时异常的父类。

2023-06-14 14:14:39 366 1

原创 try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

如果在 catch 块中使用 return 语句,则在执行 return 前会先执行 finally 块中的代码。2. 如果 try 中抛出了异常,Java 会根据异常的类型,在 catch 块中查找是否有该类型的异常处理器。如果找到了,则会执行该处理器中的代码,并跳过其他 catch 块和 finally 块的执行。总之,无论 catch 块中是否有 return 语句,finally 块中的代码都会执行。1. 如果 try 中没有抛出异常,则会跳过 catch 块直接执行 finally 块中的代码。

2023-06-14 14:10:26 764

原创 try-catch-finally 中哪个部分可以省

在try-catch中,finally块是可选的。可以有try-catch,或者try-finally,或者try-catch-finally。在某些情况下,可能并不需要在代码中使用finally块,因为不管有没有finally块,JVM在退出try/catch块时都会执行必要的清理。finally块通常用于在不管是否发生异常的情况下都需要执行的代码,比如资源的释放。总之,try块是必需的,catch块用于异常处理,finally块则是可选的,用于在代码块结束后执行一些必要的清理工作。

2023-06-14 14:07:53 47

原创 final、finally、finalize 有什么区别?

3. finalize:是一个Object类中定义的方法,用于在JVM回收对象时调用,通常用于进行资源清理操作。2. finally:是一个关键字,用在try-catch代码块中,表示无论try-catch代码块中的代码是否抛出异常,finally代码块中的代码都会被执行,一般用于释放资源或者关闭数据库连接等清理工作。综上所述,final是修饰符,表示不可变的、最终的含义,finally是一个关键字,表示无论是否抛出异常都会执行的代码块,而finalize是一个方法,用于在对象被回收时调用的资源释放操作。

2023-06-14 14:00:46 387

原创 throw 和 throws 的区别?

在这种情况下,我们在方法声明中使用 "throws" 关键字来说明该方法可能会抛出一个 FileNotFoundException 异常。这意味着该方法内部会有一些逻辑可能会导致这种异常发生。"throws" 是一个方法声明中的关键字,用于声明该方法可能会抛出的异常。"throw" 是一个关键字,用于在程序运行时抛出异常。总之,"throw" 用于在代码中抛出异常,"throws" 用于声明方法可能会抛出的异常。"throw" 和 "throws"都与异常处理有关,但它们在用法上有些不同。

2023-06-14 13:48:43 61

原创 什么是 CSRF 攻击,如何避免?

CSRF(Cross-Site Request Forgery)攻击是一种利用受害者的身份进行非法操作的网络攻击,攻击者通过欺骗用户在已登录的网站中执行恶意操作,例如在不知情的情况下转账、发帖等,而用户并未意识到这些操作是被攻击者所进行的。总之,避免 CSRF 攻击的关键在于实现双重身份验证,启用 CSRF 令牌和检查来源头部,并避免信任提交以及使用同源策略等技术,只有以此为基础的安全编程思路,才能有效保护应用程序的安全性。4. 避免信任提交:不能相信来自任何用户的提交请求,应该对每个请求进行验证和分析。

2023-06-13 11:02:06 262

原创 如何避免 SQL 注入?

1. 使用参数化的 SQL 语句:通过使用参数化的 SQL 语句,可以避免拼接字符串产生的 SQL 注入攻击,具体实现可以使用 PreparedStatement 对象,将参数化之后的 SQL 语句与参数一起传递给数据库,这样可以将参数转义后传递给数据库,防止 SQL 注入攻击。总之,避免 SQL 注入攻击的关键在于使用正确的 SQL 命令和正确的 SQL 参数化技术,以及数据验证和输入验证,服务端必要的安全配置,只有以此为基础的安全编程思路才能有效避免此类攻击。

2023-06-13 11:00:52 1375

原创 什么是 XSS 攻击,如何避免?

XSS(Cross-Site Scripting)攻击是一种常见的网络安全漏洞,攻击者通过在网站或应用程序中注入恶意代码,如 JavaScript、VBScript、HTML 等,当其他用户在访问该页面时会执行这些恶意代码,达到窃取、篡改数据等恶意行为的目的。总之,避免 XSS 攻击的关键在于对用户输入进行过滤和验证,并使用 HTTPOnly Cookie 和遵循安全编程标准等技术,只有以此为基础的安全编程思路,才能有效保护应用程序的安全性。不应依赖客户端环境,应使用严格的输入验证和输出编码技术。

2023-06-13 10:59:59 315

原创 spring mvc 和 struts 的区别是什么?

1. 架构设计方面:Spring MVC采用的是一种比较轻量化的方式,整体设计更加简洁、灵活,因为其本身是Spring框架的一部分,所以它可以集成Spring框架中的其他模块(比如Spring AOP和Spring IOC),为Web应用程序提供额外的功能,而 Struts 的核心部分更加臃肿,更为传统,具有更多的配置和框架文件。3. 性能方面:Spring MVC 代码量少,运行时间快,由于其轻量化的设计,因此Spring MVC的性能通常比 Struts 的性能要好一些。

2023-06-13 10:59:55 706

原创 假定载客户端禁止 cookie下session如何使用?session与cookie的区别是什么?

session 将数据存储在服务器端,使用 cookie 的方式传递一个标识符,而 cookie 则将数据存储在客户端,通过浏览器将数据传递到服务器端。如果客户端禁止使用 cookie,session 可以使用 URL 重写来传递会话标识符(session ID),即在每个 URL 中添加 session ID 参数来传递会话信息。这样可以解决客户端禁用 cookie 的问题,但也可能带来安全问题,因为 session ID 可能会暴露在 URL 中,容易被窃听和劫持。

2023-06-13 10:57:17 289

原创 session 的工作原理?

Session 是保存在服务器端的一组与用户相关的数据,它使用一种称为会话跟踪的技术,可以在多个请求之间存储和共享数据。需要注意的是,Session 的过期时间一般会设置,一旦过期,Session 在服务器端就会被销毁。1. 当用户首次访问 Web 应用时,Web 应用会自动生成一个唯一的 Session ID,将这个 Session ID 以 Cookie 的形式返回给浏览器。3. 当用户访问 Web 应用中的其他页面时,浏览器会自动将 Cookie 中的 Session ID 发送给服务器端。

2023-06-13 10:57:00 1044

原创 session 和 cookie 有什么区别?

2. 存储内容不同:Cookie 通常存储一些客户端比较少变的信息,比如用户账号、密码等,而 Session 主要用于存储会话状态(Session State),比如被浏览的页面、登录信息等。3. 存储安全级别不同:Cookie 存储在客户端,它的内容容易被窃听或伪造,因此 Cookie 通常用来存储一些不敏感的数据;1. 存储位置不同:Cookie 存储于客户端(浏览器),而 Session 存储于服务器端,对于服务器端存储的数据,Session 以唯一标识符构成的 Cookie 来进行跟踪。

2023-06-13 10:53:14 272

原创 说一下 JSP 的 4 种作用域?

在ServletContext对象中存储的属性或在JSP页面内使用application作用域存储的变量可以存储在Application Scope中。在请求中使用Session对象中的属性或在JSP页面内使用session作用域存储的变量可以存储在Session Scope中。2. Request Scope(请求作用域):Request Scope是在一次HTTP请求中有效的作用域,适合存储在一次请求的多个页面或组件中需要共享的数据。在JSP中,作用域是指变量的可见范围和存储位置。

2023-06-13 10:40:05 371

原创 JSP 有哪些内置对象?作用分别是什么?

4. application:代表Web应用程序,开发者可以通过它获取或设置Web应用程序全局数据(即在整个Web应用程序生命周期内都可访问的数据),例如数据库连接池、系统配置信息等。1. request:代表客户端HTTP请求,开发者可以通过它来获取客户端请求的信息,例如请求参数、请求头、HTTP请求方法等,也可以通过它将请求数据传递到其他组件。5. page:代表当前JSP页面,开发者可以通过它获取JSP页面相关的信息,例如JSP页面名称、JSP页面路径等。

2023-06-13 09:12:33 389

原创 JSP 和 servlet 有什么区别?各自特点是什么?

JSP和Servlet的最大区别在于,JSP是一种将格式化HTML代码和Java代码混合在一起的技术,而Servlet则是一种通过Java代码来生成HTML页面的技术。换句话说,JSP是一种模板技术,它允许Java代码和HTML代码混合在一起,而Servlet是一种纯Java代码技术,其中代码主要用于生成HTML页面。JSP(JavaServer Pages)和Servlet都是Java Web开发中的重要技术,它们都能够用来动态生成Web页面,但是它们的工作方式和定位不同,各有优势。

2023-06-13 09:09:32 1046

原创 深拷贝和浅拷贝区别是什么?

如果对象包含了自定义类型或可变类型的数据成员,则深拷贝和浅拷贝就会产生不同。使用深拷贝可以解决多个对象引用同一对象时的问题,避免出现数据错乱的情况,但同时也可能会增加内存占用和性能问题,因为需要拷贝对象及其子对象的所有数据成员。深拷贝是指将对象本身及其所包含的所有子对象都复制一份拷贝,赋值给新的对象。即新对象和原始对象指向了不同的对象,当一个对象发生改变时,另一个对象不会受到影响。即新对象和原始对象指向了同一个对象,当一个对象发生改变时,另一个对象也会受到影响。

2023-06-09 11:36:16 367

原创 如何实现对象克隆?

在上述代码中,我们使用了深克隆,重写了clone()方法,复制了所有属性和子对象,并使用了Address类的clone()方法复制了该对象的子对象。3. 实现深克隆或者浅克隆:如果需要实现深克隆,需要重写clone()方法,进行递归复制对象及其子对象。2. 覆盖clone()方法:被克隆的类必须覆盖clone()方法,并且在该方法中调用super.clone()方法,确保能够正确创建克隆对象。深度克隆是指复制对象及其子对象的所有信息,而浅克隆只是复制对象本身的信息,而不复制子对象。

2023-06-09 11:34:34 346

原创 为什么要使用克隆?

另外,Java中的克隆是浅克隆(即复制引用对象本身),如果需要深克隆(即递归复制对象的序列化数据),需要通过序列化和反序列化的方式实现。在Java中,克隆(Clone)是指创建一个对象的副本,即完全拷贝一个对象的状态和值,通常是通过实现Cloneable接口和覆盖Object类中的clone()方法来实现。1. 避免对原始对象的修改:如果不使用克隆,当需要对某个对象进行修改时,通常需要复制该对象的一个副本,然后进行修改,避免直接对原始对象进行修改,避免出错。

2023-06-09 11:31:44 348

原创 怎么实现动态代理?

需要实现 InvocationHandler 接口,其中的 invoke() 方法就是代理对象方法的调用处理器,该方法会在代理对象每次调用方法时执行。然后,实现了InvocationHandler接口的 MyInvocationHandler 类,用于处理代理对象方法的句柄,在其中实现了对目标方法的增强和拦截。5. 通过代理对象调用方法:通过代理对象调用方法时,实际上是调用了InvocationHandler对象的invoke()方法中编写的增强或拦截逻辑,最终调用目标方法。

2023-06-09 11:29:44 594

原创 动态代理是什么?应用场景?

基于接口的动态代理是指代理类和被代理类都要实现相同的接口,代理类在处理方法时,再通过反射机制调用被代理类的方法。基于类的动态代理是指代理类和被代理类并不需要实现相同的接口,代理类通过继承被代理类,覆盖其中的方法,并在方法中添加增强或者拦截逻辑。2. RPC调用:动态代理可以实现RPC调用,将远程调用通过代理类封装起来,直接调用代理类的方法即可。总之,动态代理是一种灵活的编程方式,可以在运行时动态地创建代理对象,并且不侵入原有业务逻辑。Java中的动态代理有两种:基于接口的动态代理和基于类的动态代理。

2023-06-09 11:26:07 251

原创 什么是反射?

因此,在需要频繁使用某一个方法或属性的时候,最好是通过常规的直接调用实现,而在使用某些框架或者完成一些复杂操作时,可以考虑使用反射机制。Java中的反射(Reflection)是指在运行时动态获取和操作类、对象、方法、属性等信息的机制。通过Class类可以获取到一个类的对象,然后通过该对象可以获取到该类的构造函数、方法、字段等信息,进而进行相应操作。4. 在运行时动态调用一个对象的方法,或者动态设置/获取一个对象的字段的值。3. 在运行时获取一个对象的字段、方法、构造函数等信息。

2023-06-09 11:23:04 30

原创 什么是 Java 序列化?什么情况下需要序列化?

Java序列化是将Java对象转换为二进制数据流的过程,也就是将对象的状态信息持久化到磁盘或者通过网络传输到其它系统中。在Java中,对象的序列化主要是通过ObjectOutputStream序列化输出流和ObjectInputStream序列化输入流实现的。同时,由于Java序列化格式是Java特定的二进制格式,因此当Java版本不同时,反序列化可能会出现兼容性问题,需要进行兼容性测试和处理。3. 传递消息:将对象序列化后,以消息的形式传递到消息队列或异步任务中,实现分布式系统的消息传递。

2023-06-09 11:22:31 523

原创 说一下 atomic 的原理?

CAS指令是一种原子操作,它可以比较内存中的值和期望值,如果相等,就把新值写入内存,否则不做任何操作。可以简单地认为CAS指令的作用是在多线程环境下实现内存中的原子操作,即保证操作的原子性。值得注意的是,由于CAS指令是通过硬件提供支持的,因此在执行过程中并没有加锁,这就意味着,使用Atomic类实现的原子操作能够保证比较高的性能和并发度,避免了显式锁带来的性能问题。Java中的原子操作是指不可分割的基本操作,如读取、修改等操作,也称为“原子性”。3. 重复上述两个步骤,直到比较成功并更新了值为止。

2023-06-09 11:18:43 275

原创 synchronized 和 ReentrantLock 区别是什么?

4. 锁的可中断性:ReentrantLock支持锁的可中断性,也就是说,当一个线程在等待锁时,如果它调用lockInterruptibly()方法,那么当其它线程调用该线程的interrupt()方法中断它时,该线程能够中断等待状态,并抛出InterruptedException异常。2. 锁的可重入性:synchronized是可重入锁,也就是说,如果一个线程已经获得了锁,那么它可以重复地进入其它由该锁保护的synchronized代码块,而不必重新获得锁。

2023-06-09 11:08:42 262

原创 synchronized 和 Lock 有什么区别?

综上所述,synchronized 是 Java 内建的同步机制,使用简单方便,在并发度不高时性能表现更好,而 Lock 是 Java API 提供的线程同步机制,可以灵活定制锁的行为,但性能开销较大,适用于高并发的场景和对并发控制有更高要求的场景。1. 锁的获取方式:synchronized 机制是隐式获取锁,不需要用户手动获取和释放锁,当对象锁被释放时,其他线程可以再次获取这个锁;而 Lock 机制则需要手动获取/释放锁,即需要通过lock()方法获得锁,再通过unlock()方法释放锁。

2023-06-08 14:50:38 454

原创 synchronized 和 volatile 的区别是什么?

而 volatile 能够更加轻量级地实现变量的可见性,适用于只需要保证某个变量的可见性,而不需要同步控制的场景。2. 内存开销:synchronized 在使用时有一定的内存开销,需要进行锁的申请、释放、等待等操作,而 volatile 则没有锁的开销,通过 CPU 的缓存一致性实现了数据的可见性。4. 使用场景:synchronized 适用于需要在代码块或者方法上进行同步控制的场景,而 volatile 适用于只需要保证变量的可见性,而不需要保证多线程之间的原子性操作的场景。

2023-06-08 14:44:29 655

原创 说一下 synchronized 底层实现原理?

2. 轻量级锁:如果两个线程竞争同一把锁,那么会进入轻量级锁,尝试通过 CAS (Compare and Swap) 操作来获取锁,此时Mark Wold 会指向锁记录(Lock Record),锁记录中存储了指向锁的指针以及指向持有该锁的线程的指针,线程还是可以直接进入运行状态。3. 重量级锁:如果轻量级锁竞争失败,证明了锁资源存在争用,多个线程通过自旋锁来争取锁,但如果到达自旋的一定阈值仍然没有获取到锁,这时候就会升级为重量级锁,重量级锁,底层是通过操作系统底层的互斥量来实现线程阻塞和唤醒的。

2023-06-08 14:34:27 103

原创 ThreadLocal 是什么?有哪些使用场景?

ThreadLocal只是提供了隔离某个变量的机制,因而与多线程操作中的同步锁没有关联。为了保证ThreadLocal变量的正确性,ThreadLocal变量应该被声明为private static类型,这样可以保证它只被初始化一次,同时由于其是static类型,因此可以为某些需要使用ThreadLocal变量的地方提供全局的访问接口。ThreadLocal是Java中的一个线程相关类,它提供了一种变量在不同线程中的独立副本机制,每个线程能够获取到该变量的副本,而不会影响其他线程的副本数据。

2023-06-08 14:15:40 74

原创 怎么防止死锁?

2. 使用tryLock()方法:可以使用ReentrantLock类的tryLock()方法,在获取锁时设置超时时间,避免一直等待而产生死锁。总之,在编写多线程应用程序时,要时刻关注并发安全问题,特别是死锁问题,尽量避免造成资源竞争和持有锁时间过长等问题,保证程序的高性能和稳定性。5. 尽量减少锁的持有时间:如果持有锁的时间过长,那么就会增加死锁的可能性,因此需要尽量减少锁的持有时间。4. 使用不同的锁:如果可以使用不同的锁来代替原有的锁,那么可以尝试使用不同的锁来避免死锁。

2023-06-06 14:57:24 2472

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除