- 博客(50)
- 收藏
- 关注
原创 面试高频知识点:2线程 2.1.6线程之间如何通信
消息传递通信方式是通过发送和接收消息来进行线程间的通信。在Java中,可以使用wait、notify和notifyAll方法实现线程之间的消息传递。共享内存通信方式是通过共享内存区域进行数据交换的方式。在Java中,可以使用共享对象(例如共享变量)来实现线程之间的通信。:通过共享内存区域进行通信,即多个线程共享同一块内存区域。通常需要使用同步机制来保护共享数据的一致性。:通过消息传递的方式进行通信,即线程之间通过发送和接收消息来进行信息交换。下面将分别介绍这两种通信方式,并提供示例代码。
2024-02-08 21:22:19 1039
原创 面试高频知识点:2线程 2.1.5如何自定义实现一个线程池
在Java中,线程池是一种用于管理线程的机制,它可以有效地管理多个线程并且可以重复使用它们,从而减少了线程创建和销毁的开销,提高了线程的利用率。本文将介绍如何自定义实现一个简单的线程池,并提供相应的Java代码示例。
2024-02-08 21:17:08 783
原创 面试高频知识点:2线程 2.1.4 线程池常用参数
当线程池已经达到最大线程数而无法继续创建新线程,并且工作队列也已满时,就会触发拒绝策略。核心池大小是线程池中始终保持存活的线程数量。当有新的任务提交时,线程池会优先使用核心池中的线程来处理任务。这个参数的合理设置直接影响着线程池的性能。空闲线程超时时间是指在任务处理完成后,线程在空闲状态持续的最长时间。通过设置适当的空闲线程超时时间,可以控制线程池的大小,避免资源浪费。最大池大小定义了线程池中允许的最大线程数量。当核心池中的线程无法满足任务处理需求时,线程池会创建新的线程,直到达到最大池大小。
2024-02-02 23:25:30 612
原创 面试高频知识点:2线程 2.1.3 项目中为什么不适用JDK默认实现的线程池
JDK默认的线程池采用无界的工作队列,这意味着如果任务提交速度高于线程处理速度,工作队列可能无限增长,最终导致内存溢出。在一些高并发的场景下,为了防止任务队列无限增长,开发者需要更加灵活地控制任务的接受和拒绝策略,而这是JDK默认线程池所欠缺的。在实际项目中,任务的性质和数量可能随着时间的推移而变化,使用固定大小的线程池可能导致资源浪费或者无法满足实际需求。自定义线程池通常提供更多的监控指标和调优选项,以便开发者更好地了解线程池的运行状态,并进行必要的性能调优。JDK默认的线程池实现。
2024-02-02 23:23:02 545
原创 面试高频知识点:2线程 2.1 线程池 2.1.1 为什么使用线程池?
线程池是一种线程管理的机制,它维护了一个线程队列,可以重复利用这些线程来执行任务,而不是为每个任务创建新的线程。这种机制的好处在于降低了线程创建和销毁的开销,提高了系统的性能和资源利用率。线程池作为一种高效的多线程管理工具,在处理并发任务时发挥了重要作用。通过优化资源管理、提高任务响应速度、降低线程创建和销毁的开销,线程池为软件开发者提供了一个强大的工具,使得多线程编程变得更加轻松和高效。
2024-01-26 09:38:41 466
原创 面试高频知识点:1集合 1.2 ConcurentHashMap是如何实现线程安全的?(1.8之前后区别)
ConcurrentHashMap(并发哈希表)是Java集合框架中的一种实现Map接口的类,它专为多线程环境设计,以提供更好的性能和线程安全。在理解 ConcurrentHashMap 是如何实现线程安全的时候,我们可以分别探讨 JDK 1.8 之前和之后的实现。
2024-01-21 15:06:10 607
原创 面试高频知识点:1集合 1.1HashSet集合的特点
HashSet不保证元素的顺序,即元素在集合中的存储顺序与它们的插入顺序无关。HashSet不是线程安全的,如果多个线程同时访问一个HashSet实例,且至少有一个线程修改了集合,那么它必须保持外部同步。HashSet中不能包含重复的元素。如果尝试将已经存在的元素添加到HashSet中,操作将被忽略,不会导致集合发生变化。HashSet允许存储null元素,但是只能存储一个null元素,因为集合中不能包含重复的元素。在上面的例子中,HashSet包含了三个不同的字符串元素和一个null元素。
2024-01-21 15:03:55 552
原创 数据库常用锁
在数据库管理系统中,锁是一种重要的机制,用于管理并发访问共享资源的方式。锁的使用可以确保事务之间的数据一致性,防止因为并发访问而导致的问题。本文将介绍一些常用的数据库锁,并提供相应的代码示例。
2023-12-11 19:26:04 395
原创 CPU密集型和IO密集型任务
CPU密集型任务是指在任务执行过程中,主要由计算操作占用大部分时间,而不是等待外部资源的任务类型。IO密集型任务是指任务执行时间主要受制于输入输出操作的速度,而非计算能力。
2023-12-07 19:23:22 618
原创 ELK的日志解决方案
打开 Kibana,导航到 "Discover" 页面,你应该能够看到从Java应用程序发送的日志。利用Kibana的搜索和可视化功能,你可以更轻松地分析和监控日志数据。这个配置文件使用Beats输入插件监听5044端口,并将数据发送到Elasticsearch。你可以根据实际需求添加其他过滤规则。确保你已经安装了Elasticsearch、Logstash和Kibana。你可以按照官方文档或使用包管理工具进行安装。将配制好的文件拷贝到容器的原文件位置替换原文件。这里用自己服务器的IP。
2023-12-06 19:37:57 1112
原创 线程池,及7大参数,4大拒绝策略
在这个例子中,我们创建了一个线程池,并提交了10个任务给线程池执行。线程空闲时间是非核心线程在空闲状态下被保留的时间,超过这个时间就会被销毁,直到线程数达到核心线程数为止。核心线程数是线程池中一直存活的线程数量,即使它们处于空闲状态也不会被销毁。拒绝策略定义了当任务无法被接受时的处理方式,例如抛出异常、丢弃任务等。线程工厂用于创建新的线程,可以自定义线程的名称、优先级等属性。最大线程数是线程池中允许的最大线程数量,包括活动和空闲线程。时间单位用于指定线程空闲时间的单位,可以是秒、毫秒等。
2023-12-05 19:07:23 491
原创 过滤器(Filter),拦截器(Interceptor),AOP之间的差异
它主要用于在请求到达目标资源之前或响应离开目标资源之后执行一些任务。过滤器通常用于实现与请求和响应处理相关的功能,如身份验证、日志记录、字符编码转换等。关键字,我们创建了一个临界区,确保在任何时候只有一个线程能够执行加锁的操作。请注意,过多的锁可能导致性能问题,因此在使用锁时需要谨慎。在Java中,AOP通常通过使用AspectJ等框架来实现。拦截器是Spring框架中的概念,用于在请求进入处理器(controller)之前和离开处理器之后执行一些任务。拦截器通常用于实现横切关注点,如日志、事务管理等。
2023-11-29 19:59:26 614
原创 代理的三种方式,静态,动态,cglib
代理是一种常见的设计模式,它允许一个对象(代理对象)控制另一个对象(真实对象)的访问。在Java中,代理主要分为静态代理和动态代理两种方式,而CGLIB代理是动态代理的一种变体。
2023-11-28 18:55:57 393
原创 解析Spring的循环依赖解决方案
在软件开发中,循环依赖是一种常见但又棘手的问题。当两个或多个组件相互依赖形成一个闭环时,系统容易陷入初始化的死循环,导致应用程序无法正确启动。Spring框架通过三级缓存的巧妙机制来解决循环依赖的问题。本文将深入探讨Spring是如何解决循环依赖的,同时提供具体的代码示例。
2023-11-27 19:05:28 383
原创 RPC与HTTP的详细比较
在这个例子中,我们使用 Spring Boot 创建了一个简单的 HTTP 服务器,并使用 RestTemplate 发送 HTTP GET 请求。在这个例子中,我们使用 Java 中的 Spring Boot 框架演示了一个简单的 HTTP 服务器和客户端。我们创建一个简单的 Web 服务,客户端通过 HTTP 请求获取服务器上的文本内容。在这个例子中,我们使用 Protocol Buffers 定义了一个简单的 RPC 服务,该服务包含一个加法操作。服务器和客户端使用 gRPC 框架进行通信。
2023-11-25 12:29:46 482
原创 设计模式之建造者模式详解与实例解析
建造者模式是一种创建型设计模式,旨在将一个复杂对象的构建过程和其表示分离,使得同样的构建过程可以创建不同的表示。通过将构造过程分解为多个步骤,建造者模式允许客户端程序在构建过程中指定对象的类型和内容。// 省略 getter 和 setter 方法// 构建品牌// 构建型号// 构建颜色// 获取构建结果通过建造者模式,我们可以将复杂对象的构建过程和表示分离,使得系统更加灵活且易于扩展。
2023-11-23 18:57:13 393
原创 http协议和websocket协议之间的区别
根据应用程序的实际需求选择合适的协议。适用于传统的请求-响应模型,如网页加载、文件下载。适用于实时性要求高、双向通信的应用,如在线游戏、即时通讯。可以通过加密提高通信的安全性。
2023-11-22 19:11:26 42
原创 ConcurrentHashMap 和 HashMap 的区别及性能比较
在 Java 中,和HashMap是两种常见的Map实现。尤其在多线程环境下,它们在设计和行为上存在一些关键的区别。在本文中,我们将深入探讨这两者之间的主要区别,并通过简单的代码示例演示它们的使用。
2023-11-21 19:36:07 485
原创 网络的七层:深入了解TCP与UDP
在计算机网络的七层模型中,传输层位于网络层之上,是负责提供端到端通信服务的关键一层。在传输层,有两个主要的协议,即TCP和UDP,它们分别为网络通信提供不同的特性和服务。
2023-11-20 19:30:52 67
原创 GitLab的搭建
命令行:docker exec -it gitlab bash 进入容器。进入容器以后输入红框中的第二个命令,等待加载。第一次登录会强制修改密码,修改以后重新登录。下载镜像gitlab/gitlab-ce。gitlab-ce是它的社区版。
2023-11-18 15:08:08 265 1
原创 生产者消费者消费者模型
在并发编程中,生产者消费者模型是一种常见的模式,用于解决多线程间的数据共享和通信问题。这种模型通常涉及到两个或多个线程之间的协作,其中一个线程负责生产数据,另一个或多个线程负责消费数据。然而,在某些情况下,我们可能会遇到一个特殊的情况,那就是“消费者消费者消费者”模型。在传统的生产者消费者模型中,生产者负责生成数据并将其放入共享缓冲区,然后通知消费者。消费者从缓冲区中取出数据进行处理。如果缓冲区为空,消费者会被阻塞,直到生产者生产出新数据并放入缓冲区。
2023-10-30 19:29:02 74
原创 数据库分表分库的原则
这样可以确保相同ID的用户数据被存储在相同的表中,同时可以将负载分散到不同的数据库上。它将不同的表存储在不同的数据库中,例如将订单表、支付表、优惠券表等存储在不同的数据库中。将经常访问的字段存储在一个表中,而将不经常访问的字段存储在另一个表中。在Java中,可以使用JDBC连接不同的数据库,并使用SQL语句对数据库进行操作。水平拆分数据库是将一个表中的数据拆分成多个部分,并将它们存储在不同的数据库中。在Java中,可以通过创建一个包含常用字段的表对象和一个包含非常用字段的表对象来实现垂直拆分。
2023-10-28 11:58:48 39
原创 Threadlocal对象的使用
在Java编程中,Threadlocal是一种非常有用的工具,它可以帮助我们创建线程局部变量。每个线程都有其自己独立的Threadlocal变量副本,线程之间互不影响。Threadlocal通常用于在多线程环境中保存线程特定的状态或数据。
2023-10-25 19:04:29 41
原创 CAS 乐观锁
在enqueue()方法中,我们创建一个新的节点,然后在一个while循环中尝试将新节点插入到队列的尾部。如果头节点等于头部的引用,我们检查头节点是否等于尾节点,如果相等,说明队列为空,抛出一个EmptyException异常。CAS操作会检查内存位置V的值是否等于预期值E,如果相等,则将内存位置V的值更新为新值N,并返回true,否则返回false。然后,我们定义了队列的头部和尾部,它们都是AtomicReference类型,可以保证在并发环境中的线程安全性。因此,使用CAS可以避免阻塞和死锁问题。
2023-10-24 19:01:28 87
原创 RBAC - 基于角色权限的模型
它的核心思想是将访问权限与角色相绑定,而不是直接将权限赋予具体的用户。在RBAC中,用户被分配到不同的角色,每个角色拥有特定的权限。角色权限关联表(Role_Permissions):存储角色与权限的关联关系。权限表(Permissions):存储权限信息,如权限名称、描述等。用户角色关联表(User_Roles):存储用户与角色的关联关系。用户表(Users):存储用户信息,如用户名、密码、邮箱等。角色表(Roles):存储角色信息,如角色名称、描述等。RBAC - 基于角色权限的模型。
2023-10-22 16:24:01 90
原创 redis的五中常用类
ZREM:从有序集合中移除指定的成员。SADD:将一个或多个值插入到集合中。哈希表类型允许你存储一个键值对的集合,其中每个键都可以映射到一个字符串类型的值。例如:SISMEMBER key value。SREM:从集合中移除指定的值。例如:HSET key field value。例如:HEXISTS key field。例如:SET key value。例如:HGET key field。例如:HDEL key field。例如:LPOP key。例如:RPOP key。例如:EXISTS key。
2023-10-19 19:03:22 34
原创 springmvc的工作流程
MVC是一种软件架构模式,它将应用程序分为三个主要组成部分:模型(Model)、视图(View)和控制器(Control)。模型(Model):负责处理应用程序的核心业务逻辑和数据。在SpringMVC中,模型是与视图和控制器分离的,这使得模型可以独立于视图和控制器进行开发和测试。视图(View):负责呈现数据给用户,即用户界面。在SpringMVC中,视图通常由JSP、Thymeleaf、FreeMarker等视图技术来创建。控制器(Control)
2023-10-17 19:18:41 32
原创 数据库事务概念及特点
数据事务是一种用于确保一系列数据库操作(可以是读操作或写操作)作为一个原子性操作进行工作的机制。这意味着这些操作要么全部成功完成,要么全部失败,不会出现部分成功的情况。这可以确保数据的完整性和一致性。当你在数据库中进行操作时,你可能会进行一系列的读或写操作,例如在银行转账中,你可能需要从一个账户扣除金额,并将其添加到另一个账户。你希望这些操作作为一个整体来执行,要么全部成功,要么全部失败。数据事务就是用于确保这种原子性的机制。数据事务具有四个特性,即原子性、一致性、隔离性和持久性。
2023-08-22 19:46:45 88 1
原创 java的反射
Java的反射(Reflection)是一种强大的工具,它允许在运行时检查Java对象、类、方法和属性的信息,甚至可以动态地创建对象、调用方法和修改属性。这种能力在编写通用工具、框架、插件等应用中非常有用。
2023-08-17 19:51:38 48 1
原创 什么RPC技术?
RPC(Remote Procedure Call,远程过程调用)是一种协议,允许在一个计算机程序中调用另一个计算机程序中的函数或过程。RPC 技术通常使用在网络通信中,它将网络通信协议作为底层支持,提供一种抽象的调用接口,使得程序员可以使用一致的调用方式来调用远程函数或过程,而无需关心底层的网络细节。在上面的例子中,MyObject类实现了Serializable接口,这使得它可以被序列化。在Java中,RPC技术通常使用在网络通信中,它允许在一个计算机程序中调用另一个计算机程序中的函数或过程。
2023-08-16 19:51:51 95 1
原创 正向代理与反向代理
当客户端向反向代理发送请求时,反向代理将请求转发给后端的某个应用服务器(这个过程对客户端是透明的),然后从应用服务器获取响应并返回给客户端。当客户端需要从目标服务器获取信息时,它会向正向代理发送请求,然后由正向代理向目标服务器发送请求并将响应返回给客户端。总结来说,正向代理和反向代理都可以实现数据传输和代理的功能,但它们的位置、作用和用途有所不同。正向代理(Forward Proxy)和反向代理(Reverse Proxy)都是网络架构中的技术,它们在处理客户端请求和服务端响应的方式上有所不同。
2023-08-14 19:27:04 56
原创 Redisson的看门狗策略
接下来,我们使用getBucket方法获取该键的值,并使用setAsync方法修改该键的值。当该键的值被修改时,我们的操作将被触发并输出新的值。当应用程序使用Redisson库监视一个键时,Redisson的看门狗策略会自动检测这个键的变化,并在该键被修改时触发相应的操作。这个机制可以有效地防止死锁和其他并发问题。例如,如果一个应用程序正在等待一个键被修改,而另一个应用程序正在修改这个键,那么在使用Redisson的看门狗策略的情况下,第一个应用程序会自动等待第二个应用程序完成修改操作,避免了死锁的发生。
2023-08-10 20:11:49 1613 1
原创 死锁的四个必要条件,如何防止死锁
在这个例子中,我们使用了两个线程来模拟两个进程的执行。每个进程都需要获取两个资源的锁,然后才能继续执行。如果一个进程先获取了第一个资源的锁,然后尝试获取第二个资源的锁时被阻塞,另一个进程就可以获取第一个资源的锁并继续执行。这样就可以避免死锁的发生。
2023-08-09 19:30:38 581
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人