当前位置: 首页 > news >正文

java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

有面试题,有synchronized锁,threadlocal

  • 一、面试题小记
  • 二、加锁synchronized
    • 1. 先看代码
    • 2. synchronized 讲解
      • 2.1. 同步代码块
      • 2.2. 同步方法
      • 2.3. 锁的选择和影响
      • 2.4. 注意事项
      • 2.5 锁的操作,手动释放锁,显式地获取锁(属性名第一个lock代表的是)
  • 三、ThreadLocal
    • 1. 基本用法
    • 2. ThreadLocal 的关键方法
    • 3. 使用场景
    • 4. 注意事项
    • 5. 示例:使用 ThreadLocal 进行数据库连接管理
  • 四、数据库用来设置某个字段的默认值。
  • 五、 把redis的json转为对象
    • 1. 从 Redis 获取 JSON 数据
    • 2 使用 Gson

(一切都是自己的笔记!!!请勿上纲上线)

一、面试题小记

在这里插入图片描述
在这里插入图片描述
java10 本地类型推断
在这里插入图片描述
switch表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、加锁synchronized

1. 先看代码

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.HashSet;public class Example {private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");private static final Set<String> dates = new HashSet<>();private static final CountDownLatch countDownLatch = new CountDownLatch(10);private static final ExecutorService pool = Executors.newFixedThreadPool(10);public void addDate(int i) {Calendar calendar = Calendar.getInstance(); // 创建Calendar实例int finalI = i; // final变量用于在lambda表达式中使用pool.execute(() -> {synchronized (simpleDateFormat) { // 对simpleDateFormat加锁// 时间增加calendar.add(Calendar.DATE, finalI);// 通过simpleDateFormat把时间转换成字符串String dateString = simpleDateFormat.format(calendar.getTime());// 把字符串放入Set中dates.add(dateString);}// CountDowncountDownLatch.countDown();});}public void awaitCompletion() throws InterruptedException {countDownLatch.await(); // 等待所有线程完成pool.shutdown(); // 关闭线程池}public static void main(String[] args) throws InterruptedException {Example example = new Example();for (int i = 0; i < 10; i++) {example.addDate(i); // 添加日期}example.awaitCompletion(); // 等待所有线程完成System.out.println(dates); // 输出结果}
}

2. synchronized 讲解

synchronized 是 Java 中用于实现线程同步的关键字,确保多个线程在执行某段代码时不会发生冲突,从而保证线程安全。它有两种主要的使用方式:同步代码块和同步方法。

2.1. 同步代码块

通过 synchronized 关键字修饰的代码块可以确保在同一时间只有一个线程可以执行该代码块中的代码。以下是如何使用同步代码块的示例:

public class SynchronizedBlockExample {private final Object lock = new Object(); // 用于锁定的对象public void doWork() {synchronized (lock) { // 对 lock 对象加锁// 临界区代码System.out.println("Thread " + Thread.currentThread().getName() + " is working.");} // 离开synchronized块时自动释放锁}
}

锁定对象:synchronized (lock) 表示对 lock 对象加锁。只有获取了 lock 锁的线程可以执行 synchronized 块中的代码。
自动释放:当线程退出 synchronized 块(包括发生异常的情况),JVM 会自动释放锁。

2.2. 同步方法

synchronized 也可以用于修饰方法,这样整个方法在同一时间只会被一个线程执行。同步方法可以分为实例方法和静态方法:

实例同步方法:锁定的是方法所在对象的实例。

public class SynchronizedMethodExample {public synchronized void instanceMethod() {// 临界区代码System.out.println("Thread " + Thread.currentThread().getName() + " is working.");}
}

静态同步方法:锁定的是类的 Class 对象。静态同步方法同一时间只允许一个线程访问类的所有实例的静态方法。

public class SynchronizedStaticMethodExample {public static synchronized void staticMethod() {// 临界区代码System.out.println("Thread " + Thread.currentThread().getName() + " is working.");}
}

2.3. 锁的选择和影响

对象锁:在同步代码块中指定的对象(例如 lock 对象)会作为锁对象。这种锁是对象级别的,不同对象的同步代码块不会互相影响。

类锁:对于静态同步方法,锁的是类的 Class 对象。这意味着类的所有静态同步方法是互斥的。

锁的粒度:选择锁的粒度时需要考虑性能和安全。粒度过大(例如锁住整个方法或类)可能导致性能下降,而粒度过小则可能无法有效防止数据竞争。

2.4. 注意事项

死锁:多个线程可能互相等待对方释放锁,导致系统僵死。应避免复杂的锁定顺序和嵌套锁。

性能开销:同步会引入性能开销,因为它涉及到线程上下文的切换和锁管理。只在必要时使用同步,尽量减少锁的持有时间。

不可重入:虽然 synchronized 是可重入的(即同一个线程可以多次获取同一个锁),但在设计时仍需注意避免复杂的锁定结构。

总结
同步代码块:通过 synchronized (lock) 对特定的对象进行加锁,确保只有一个线程能执行代码块中的代码。
同步方法:通过 synchronized 关键字修饰实例方法或静态方法,确保方法在同一时间内只有一个线程能执行。

2.5 锁的操作,手动释放锁,显式地获取锁(属性名第一个lock代表的是)

lock.lock():显式地获取锁。
lock.unlock():在 finally 块中释放锁,以确保即使发生异常也能释放锁。

三、ThreadLocal

ThreadLocal 是 Java 中用于实现线程局部存储的类,允许每个线程在访问某个变量时拥有自己的独立副本。这样,每个线程都可以操作自己的副本而不会与其他线程的副本发生冲突。ThreadLocal 主要用于需要线程隔离的场景,例如每个线程需要独立的配置、数据库连接、会话等。

1. 基本用法

ThreadLocal 的基本用法非常简单。可以通过 ThreadLocal 提供的 get 和 set 方法来获取和设置当前线程的值。

public class ThreadLocalExample {private static final ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 1);public static void main(String[] args) {Runnable task = () -> {// 获取当前线程的线程局部变量值Integer value = threadLocalValue.get();System.out.println("Initial Value: " + value);// 设置当前线程的线程局部变量值threadLocalValue.set(value + 1);// 再次获取当前线程的线程局部变量值System.out.println("Updated Value: " + threadLocalValue.get());};// 创建多个线程,测试每个线程的线程局部变量是否独立Thread thread1 = new Thread(task);Thread thread2 = new Thread(task);thread1.start();thread2.start();}
}

2. ThreadLocal 的关键方法

ThreadLocal.withInitial(Supplier<? extends T> supplier):创建一个 ThreadLocal 实例,并设置初始值。这个方法可以指定一个 Supplier 来提供初始值。

T get():获取当前线程的 ThreadLocal 变量的值。如果当前线程没有设置过这个值,则会调用 initialValue() 方法来设置初始值。

void set(T value):设置当前线程的 ThreadLocal 变量的值。

void remove():移除当前线程的 ThreadLocal 变量的值,防止内存泄漏。

3. 使用场景

ThreadLocal 主要适用于以下场景:

数据库连接:每个线程需要一个独立的数据库连接。

用户会话:每个线程需要维护独立的用户会话信息。

配置和上下文:每个线程需要独立的配置或上下文信息。

4. 注意事项

内存泄漏:如果 ThreadLocal 的 ThreadLocalMap 中的 ThreadLocal 引用被持有而没有被正确清理(通过调用 remove() 方法),可能会导致内存泄漏,特别是在长期运行的应用中。由于 ThreadLocal 是线程本地的,它的值只会在当前线程中有效,所以如果线程池中线程长时间存在而没有被回收,就可能导致内存泄漏。

适用性:ThreadLocal 适用于线程独立的场景。如果不同线程之间需要共享数据,考虑使用其他同步机制(如 synchronized 或 Concurrent 数据结构)。

性能:虽然 ThreadLocal 提供了线程隔离,但它也有一定的性能开销。避免在高并发场景中频繁使用 ThreadLocal,特别是当线程局部变量对象较大或线程较多时。

5. 示例:使用 ThreadLocal 进行数据库连接管理

public class DatabaseConnectionManager {private static final ThreadLocal<Connection> connectionHolder = ThreadLocal.withInitial(() -> {try {return DriverManager.getConnection("jdbc:yourdb", "username", "password");} catch (SQLException e) {throw new RuntimeException(e);}});public static Connection getConnection() {return connectionHolder.get();}public static void closeConnection() {Connection connection = connectionHolder.get();if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();} finally {connectionHolder.remove(); // 清理线程局部变量}}}
}

在这个示例中,每个线程会有自己独立的数据库连接,使用完后记得调用 remove() 方法以避免潜在的内存泄漏。

四、数据库用来设置某个字段的默认值。

ALTER TABLE in_inspect_info
ALTER result SET DEFAULT 1;

五、 把redis的json转为对象

从 Redis 中获取 JSON 数据并将其转换为 Java 对象,通常涉及以下几个步骤:

从 Redis 获取 JSON 数据: 你可以使用 Redis 客户端库(例如 Jedis 或 Lettuce)从 Redis 中获取存储的 JSON 数据。
将 JSON 转换为 Java 对象: 使用 JSON 解析库(如 Jackson 或 Gson)将 JSON 字符串转换为 Java 对象。
以下是详细的步骤和代码示例:

1. 从 Redis 获取 JSON 数据

假设你使用 Jedis 作为 Redis 客户端库,首先从 Redis 中获取 JSON 数据:

import redis.clients.jedis.Jedis;public class RedisExample {public static void main(String[] args) {// 创建 Jedis 实例Jedis jedis = new Jedis("localhost", 6379);// 从 Redis 中获取 JSON 数据String jsonData = jedis.get("yourRedisKey");// 关闭 Jedis 连接jedis.close();// 打印获取到的 JSON 数据System.out.println(jsonData);}
}
  1. 将 JSON 转换为 Java 对象
    使用 Jackson 或 Gson 库将 JSON 字符串转换为 Java 对象。以下是使用 Jackson 和 Gson 的示例。

使用 Jackson
添加依赖(如果你使用 Maven,可以在 pom.xml 中添加以下依赖):

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>

转换 JSON:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonExample {public static void main(String[] args) {String jsonData = "{\"term_sn\":\"12345\",\"devid_qi_cname\":\"设备名称\",\"devid_qi_time\":\"2024-07-22T10:00:00Z\",\"inspect_list\":[{\"code\":\"INS001\",\"name\":\"检查1\",\"term_sn\":\"TERM001\",\"inspect_ask\":\"检查要求1\",\"result\":\"结果1\"},{\"code\":\"INS002\",\"name\":\"检查2\",\"term_sn\":\"TERM002\",\"inspect_ask\":\"检查要求2\",\"result\":\"结果2\"}],\"dq_info_file_ids\":98765,\"devidqi_state\":1}";ObjectMapper objectMapper = new ObjectMapper();try {// 将 JSON 转换为 Java 对象MyClass myObject = objectMapper.readValue(jsonData, MyClass.class);// 打印转换后的对象System.out.println(myObject);} catch (Exception e) {e.printStackTrace();}}
}class MyClass {private String term_sn;private String devid_qi_cname;private String devid_qi_time;private List<Inspect> inspect_list;private int dq_info_file_ids;private int devidqi_state;// Getter 和 Setter 方法@Overridepublic String toString() {return "MyClass{" +"term_sn='" + term_sn + '\'' +", devid_qi_cname='" + devid_qi_cname + '\'' +", devid_qi_time='" + devid_qi_time + '\'' +", inspect_list=" + inspect_list +", dq_info_file_ids=" + dq_info_file_ids +", devidqi_state=" + devidqi_state +'}';}
}class Inspect {private String code;private String name;private String term_sn;private String inspect_ask;private String result;// Getter 和 Setter 方法@Overridepublic String toString() {return "Inspect{" +"code='" + code + '\'' +", name='" + name + '\'' +", term_sn='" + term_sn + '\'' +", inspect_ask='" + inspect_ask + '\'' +", result='" + result + '\'' +'}';}
}

2 使用 Gson

添加赖(如果你使用 Maven,可以在 pom.xml 中添加以下依赖):

<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version>
</dependency>

转换 JSON:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;public class JsonExample {public static void main(String[] args) {String jsonData = "{\"term_sn\":\"12345\",\"devid_qi_cname\":\"设备名称\",\"devid_qi_time\":\"2024-07-22T10:00:00Z\",\"inspect_list\":[{\"code\":\"INS001\",\"name\":\"检查1\",\"term_sn\":\"TERM001\",\"inspect_ask\":\"检查要求1\",\"result\":\"结果1\"},{\"code\":\"INS002\",\"name\":\"检查2\",\"term_sn\":\"TERM002\",\"inspect_ask\":\"检查要求2\",\"result\":\"结果2\"}],\"dq_info_file_ids\":98765,\"devidqi_state\":1}";Gson gson = new Gson();// 将 JSON 转换为 Java 对象MyClass myObject = gson.fromJson(jsonData, MyClass.class);// 打印转换后的对象System.out.println(myObject);}
}class MyClass {private String term_sn;private String devid_qi_cname;private String devid_qi_time;private List<Inspect> inspect_list;private int dq_info_file_ids;private int devidqi_state;// Getter 和 Setter 方法@Overridepublic String toString() {return "MyClass{" +"term_sn='" + term_sn + '\'' +", devid_qi_cname='" + devid_qi_cname + '\'' +", devid_qi_time='" + devid_qi_time + '\'' +", inspect_list=" + inspect_list +", dq_info_file_ids=" + dq_info_file_ids +", devidqi_state=" + devidqi_state +'}';}
}class Inspect {private String code;private String name;private String term_sn;private String inspect_ask;private String result;// Getter 和 Setter 方法@Overridepublic String toString() {return "Inspect{" +"code='" + code + '\'' +", name='" + name + '\'' +", term_sn='" + term_sn + '\'' +", inspect_ask='" + inspect_ask + '\'' +", result='" + result + '\'' +'}';}
}

关键点总结
选择合适的库: Jackson 和 Gson 都是流行的 JSON 解析库,可以根据你的需求选择其中一个。
确保字段匹配: JSON 字段名称应与 Java 类中的字段名称匹配,注意大小写和命名风格。
处理日期: 如果 JSON 中包含日期,确保正确解析和格式化日期字段。

相关文章:

java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

有面试题&#xff0c;有synchronized锁&#xff0c;threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作&#xff0c;手动释放锁&#xff0c;显式地获取锁&#xff08;属…...

Apache Spark:深度解析

文章目录 引言Apache Spark 官网链接Spark 的原理1. 核心组件2. 弹性分布式数据集&#xff08;RDD&#xff09;3. 执行模型 基础使用1. 环境搭建2. 示例代码 高级功能1. DataFrame 和 Dataset2. 机器学习3. 流处理 优缺点优点缺点 结论 引言 Apache Spark 是一个快速、通用、可…...

使用umi作为模板如何实现权限管理

三种权限管理的方法&#xff1a; 在做后台管理系统时&#xff0c;难免会使用到权限管理&#xff0c;权限管理方式有三种&#xff0c;分别是&#xff1a;路由、守卫、后端配合。 路由&#xff1a;通过动态路由&#xff0c;根据登录人员不同注册不同的路由&#xff0c;直接让没…...

系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识 4.1.1 信息安全的概念4.1.1.1 信息安全的范围4.1.1.1.1 设备安全4.1.1.1.2 数据安全4.1.1.1.3 内容安全4.1.1.1.4 行为安全 4.1.2 信息存储安全4.1.2.1 信息使用的安全4.1.2.1.1 用户的标识与验证4.1.2.1.…...

【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架

探索Rust游戏开发引擎&#xff1a;选择合适的工具 前言 随着Rust语言的不断发展&#xff0c;越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架&#xff0c;分别对其核心功能、使用场景、安装与配置以及API进行概览…...

从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

近年来&#xff0c;星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作&#xff0c;推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术&#xff0c;以及信雅达在金融领域的深厚积累&#xff0c;围绕数…...

自定义维度映射:Kylin Cube设计的高级玩法

自定义维度映射&#xff1a;Kylin Cube设计的高级玩法 在数据仓库领域&#xff0c;Apache Kylin以其高性能的分析能力而闻名。Kylin通过构建多维数据立方体&#xff08;Cube&#xff09;来实现对大数据集的快速查询。Cube设计中的维度映射是优化查询性能的关键环节。本文将探讨…...

c17 新特性 字面量,变量,函数,隐藏转换等

导论 c17新特性引入了许多新的语法&#xff0c;这些语法特性更加清晰&#xff0c;不像传统语法&#xff0c;语义飘忽不定&#xff0c;比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i i&#xff0c;最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测&a…...

git操作的一些备忘录

1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一&#xff1a;(已经提交到git线上仓库了&#xff0c;git reset操作&#xff0c;会把之前提交的都删除&#xff0c;感觉有点危险) 想要让Git回退历史&#xff0c;有以下步骤&#xff1a; 使用git log命令&#xff0c…...

vscode回退不显示了,不方便操作

一、后退前进按钮 顶部显示&#xff0c;方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom...

常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值

一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性&#xff0c;子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性&#xff0c;具有继承性。代码如下&a…...

react入门到实战-day2-7.21

昨天晚上刚学完已经一点了&#xff0c;来不及写笔记&#xff0c;主要是想睡觉哈&#xff0c;所以今天补上&#xff0c;我发现效率还挺高的&#xff0c;今天重新做笔记&#xff0c;加固了昨天的知识点&#xff0c;要不以后都这样子哈&#xff0c;学完第二天再写哈&#xff0c;要…...

Springboot集成Elasticsearch High Level REST Client实现增删改查实战

获取源码&#x1f6a9; 需要完整代码资料&#xff0c;请一键三连后评论区留下邮箱&#xff0c;安排发送&#xff01;&#xff01;&#xff01;&#x1f916; 什么是High Level REST Client&#xff1f; Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…...

2023河南萌新联赛第(二)场 南阳理工学院

A. 国际旅行Ⅰ 题目&#xff1a; 思路&#xff1a; 因为题意上每个国家可以相互到达&#xff0c;所以只需要排序&#xff0c;输出第k小的值就可以了。 AC代码&#xff1a; #include<bits/stdc.h> #define int long long #define IOS ios::sync_with_stdio(0);cin.tie…...

使用Docker Compose给自己上传的JAR打包成镜像并自动启动容器

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写一个docker-compose.yml文件&#xff0c;可以简化Docker容器的管理。本文将介绍如何使用Docker Compose将一个上传的JAR文件打包成Docker镜像&#xff0c;并在容器中自动启动该应用程序。 一、准备工作…...

NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书

Certificate证书 Certificate称为数字证书。数字证书是一种证明身份的电子凭证&#xff0c;它包含一个公钥和一些身份信息&#xff0c;用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下&#xff1a; 由权威机构颁发&…...

DML数据库的数据类型

DML 用于改变数据表中的数据的操作语言。 包括INSERT&#xff08;将数据插入到数据表中&#xff09;,UPDATE&#xff08;更新表中已经存在的数据&#xff09;,DELETE&#xff08;删除表中已经存在的数据&#xff09; INSERT 用法 INSERT INTO 表名&#xff08;字段1&#x…...

@RequestParam和@PathVariable 处理 HTTP 请求参数的注解

RequestParam 请求参数 可解析前端get请求路径后以问号拼接的参数,查询参数是 URL 后面的问号 (?) 后跟的一系列键值对,RequestParam 可以设置参数是否是必需的&#xff08;使用 required 属性&#xff09; GetMapping("/users") public String getUsers(RequestPar…...

《代码大全》读书笔记-第Ⅰ部分 奠定基础

0.欢迎来到软件构建世界 什么是软件构件&#xff1a; 对于非正式及项目&#xff0c;会觉得罗列出来的这些活动太过于繁复。但是这些对于正式项目都是很有必要的(大部分人都没经历过&#xff0c;比如说我)。一般一些小公司主要也就是需求分析、编码、开发人员自测、集成测试这几…...

杰发科技Bootloader(1)—— Keil配置地址

IAP方式 BootLoader方式 UDSBoot方式 AC7801的地址分配 用户空间的的地址从8000000开始分配&#xff0c;大小是64页&#xff0c;即128K。 RAM地址从20000000开始 基于UDSboot调试-Boot 烧录Boot之后&#xff0c;ATClinkTool无法连接 用keil查看内存&#xff0c;地址到8005388…...

338. 比特位计数

338. 比特位计数 题目链接&#xff1a;338. 比特位计数 代码如下&#xff1a; class Solution { public:vector<int> countBits(int n) {vector<int> res(n 1, 0);for (int i 1; i < n; i){if (i % 2 1) { res[i] res[i - 1] 1; }else { res[i] res[i …...

flask后端+vue前端——后端怎么发文件给前端?

首先&#xff0c;前端axios请求的responseType要设置为blob const service axios.create({baseURL: http://127.0.0.1/api,timeout: 5000});//向后端发送数据&#xff0c;后端根据这个数据data生成文件返回send_coordinate(data){return service.post(/,data,{responseType: …...

计算机毕业设计django+hadoop+scrapy租房可视化 租房推荐系统 租房大屏可视化 租房爬虫 spark 58同城租房爬虫 房源推荐系统

python scrapy bootstrap jquery css javascript html 租房信息数据展示 租房地址数量分布 租房类型统计 租房价格统计分析 租房面积分析 房屋朝向分析 房屋户型平均价格统计分析 房屋楼层统计分析 房屋楼层与价格统计分析 房屋地址与价格统计分析 房屋相关信息词云展示 租房…...

【Tomcat】Mac M3 Pro安装Tomcat7

文章目录 下载配置环境变量修改权限启动和关闭 下载 官网&#xff1a;https://tomcat.apache.org/ cd ~/Library tar -zxvf /Users/用户名/Downloads/apache-tomcat-7.0.99.tar.gz mv apache-tomcat-7.0.99 ~/Library/tomcat配置环境变量 vi ~/.bash_profileexport TOMCAT…...

Spring Boot(八十二):SpringBoot通过rsa实现API加密

项目中使用RSA加密方式对API接口返回的数据加密,让API数据更加安全。别人无法对提供的数据进行破解。Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密 。 下面开始代码演示 1 接口加密 1.1 新建一个springboot项目 1.2 添加依赖 <dependency>&l…...

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外&#xff0c;还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相&#xff0c;成为赛场上另一道亮丽的风景线。 在新时代的浪潮中&#xff0c;中国制造业坚…...

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC&#xff1a;Reduced Instruction Set Computing)&#xff0c;它所用的指令比较简单&#xff0c;有如下特点&#xff1a; ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …...

【JavaScript】01数组原型对象的最后一个元素、计数器

题目一&#xff1a;数组原型对象的最后一个元素 请你编写一段代码实现一个数组方法&#xff0c;使任何数组都可以调用 array.last() 方法&#xff0c;这个方法将返回数组最后一个元素。如果数组中没有元素&#xff0c;则返回 -1 。 你可以假设数组是 JSON.parse 的输出结果。…...

解决R语言找不到系统库导致的报错

1、基本需知 1.1、系统库 系统库&#xff08;System library&#xff09;是一组预先编写和编译好的软件模块集合&#xff0c;用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供&#xff0c;并且在系统安装过程中被预装或者用户可以额…...

Java高并发理论基础

并发级别 由于临界区的存在&#xff0c;多线程之间的并发必须受到控制。根据控制并发的策略&#xff0c;我们可以把并发的级别分为 阻塞、无饥饿、无障碍、无锁、无等待 几种。 阻塞 一个线程是阻塞的&#xff0c;那么在其他线程释放资源之前&#xff0c;当前线程无法继续执…...