当前位置: 首页 > 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;当前线程无法继续执…...

Spring事件机制

文章目录 一、Spring事件二、实现Spring事件1、自定义事件2、事件监听器2.1 实现ApplicationListener接口2.2 EventListener2.3 TransactionalEventListener 3、事件发布4、异步使用 三、EventBus1、事件模式2、EventBus三要素3、同步事件3.1 定义事件类3.2 定义事件监听3.3 测…...

vue+canvas音频可视化

1.代码 <template><div class"subGuide"><canvas id"canvas"></canvas><br><audio id"audio" src"./audio.mp3" controls></audio></div> </template><script> export…...

俊昭stm32笔记

stm32——中断优先级 stm32——创建基础工程模板stm32——创建基础工程模板-CSDN博客 stm32——MCU启动方式stm32——MCU启动方式_stm32调试时程序启动方式-CSDN博客 stm32——串口stm32——串口_stm32 串口-CSDN博客 stm32——lcd液晶显示stm32——lcd液晶显示-CSDN博客...

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性&#xff0c;将pystest、selenium、allure结合起来 功能如下&#xff0c;web自动化&#xff0c;输入baidu网站&#xff0c;搜索“雷军”、打开网页中第一条内容 pytestsel.py如下&#xff1a; import time import re import allure import pytest from tools…...

如何在 Debian 8 上安装和使用 PostgreSQL 9.4

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 关系型数据库是满足多种需求的数据组织的基石。它们支持从在线购物到火箭发射等各种应用。PostgreSQL 是一种历史悠久但仍然活跃的…...

【微信小程序】微信小程序设置本地背景图片在真机无法显示的解决方案

微信小程序设置本地背景图片在真机无法显示的解决方案 在开发微信小程序时&#xff0c;很多开发者会遇到一个常见的问题&#xff1a;在调试环境中设置本地背景图片可以正常显示&#xff0c;但在真机上却无法显示。本文将详细探讨这一问题的原因&#xff0c;并提供三种解决方案…...

Arthas在线诊断案例实战整理

Arthas - Java 应用诊断利器 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法…...

使用 XRDP 远程linux主机

一、简介 XRDP是一个开源的远程桌面协议&#xff08;Remote Desktop Protocol,RDP&#xff09;服务器&#xff0c;采用的是标准的RDP。 官网地址&#xff1a;https://www.xrdp.org/ github地址&#xff1a; https://github.com/neutrinolabs/xrdp/releases XRDP也是C/S架构&…...

学习小型gpt源码(自用)

数据集构建_哔哩哔哩_bilibili &#xff08;b站上有一系列课&#xff0c;从数据处理到模型构建和训练使用&#xff09; 什么是batch&#xff1f; 为什么一个batch内的句子要一样长&#xff1f; 不同batch的长度可以不一样&#xff0c;但是同一个batch内长度一样&#xff01;…...

@Transactional使用的注意事项

在项目中涉及到CRUD操作时&#xff0c;一般都会在方法上添加该注解&#xff0c;以为加上Transactional&#xff0c;Spring就可以自动帮我们进行事务的开启、提交 有一个很多人都会犯的误区&#xff1a; 将Spring事务与Transactional划上了等号&#xff0c;只要有数据库相关操作…...

快手可灵视频生成大模型全方位测评

快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;是全球首个真正用户可用的视频生成大模型&#xff0c;自面世以来&#xff0c;凭借其无与伦比的视频生成效果&#xff0c;在全球范围内赢得了用户的热烈追捧与高度评价。截至目前&#xff0c;申请体验其内测…...

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…...

Ubuntu22.04使用NVM安装多版本Node.js和版本切换

Fabric官方目前支持Node.js开发区块链应用&#xff0c;建议使用Node长期支持版本&#xff08;LTS&#xff09;。 建议使用NVM安装Node.js&#xff0c;NVM可以帮助我们方便的在Node的不同版本之间进行切换&#xff0c;这样我们就可以同时工作在不同的项目上。 下面是安装的脚本…...

基于C51和OLED12864实现Goole小恐龙

在数字娱乐领域&#xff0c;Google小恐龙&#xff08;T-Rex Runner&#xff09;以其简单而上瘾的游戏机制赢得了广泛的关注和喜爱。这款内置于Chrome浏览器的离线小游戏&#xff0c;不仅为用户带来了乐趣&#xff0c;也激发了开发者们对其进行各种创新和扩展的灵感。本文将介绍…...

【Docker】CentOS7环境下的安装

环境展示 安装 配置仓库 sudo yum install -y yum-utils # docker官方key文件下载 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 建议使用阿里云key文件下载 sudo yum-config-manager --add-repo https://mirrors.aliyun.…...

浏览器的最大并发数(http1.1)

HTTP/1.1&#xff1a;每个资源请求通常需要单独的TCP连接&#xff0c;尽管支持Keep-Alive机制&#xff0c;允许在同一个TCP连接上连续发送多个请求。但通常浏览器限制并发TCP连接数&#xff08;例如&#xff0c;每个域名最多6个并发连接&#xff09;。 HTTP/2&#xff1a;引入…...

Android 开发中px、dpi 和 dp三个单位的介绍

Android 开发中px、dpi 和 dp三个单位的介绍 在 Android 开发中&#xff0c;px、dpi 和 dp 是用来描述屏幕尺寸和密度的单位&#xff0c;它们在设计和开发中有着不同的作用和用途。 1. px&#xff08;像素&#xff09; 定义&#xff1a; px 表示屏幕上的一个像素点&#xff0c…...

zookeeper开启SASL权限认证

目录 一、SASL介绍 二、使用 SASL 进行身份验证 2.1 服务器到服务器的身份验证 2.2 客户端到服务器身份验证 三、验证功能 一、SASL介绍 默认情况下&#xff0c;ZooKeeper 不使用任何形式的身份验证并允许匿名连接。但是&#xff0c;它支持 Java 身份验证与授权服务(JAAS)…...

mysql一个小问题引发的思考-mysql类型转换-查询缓存 及 MYSQL查询缓存以及自动选择不使用查询缓存的情况

一、mysql一个小问题引发的思考-mysql类型转换-查询缓存 最近在做的一个项目中有一个SQL语句发现点问题&#xff0c;大概如下&#xff1a; select * from table where cid0 or find_in_set(1, cid); 数据表中的字段cid是字符串类型&#xff0c;原来的后端同学未提过此字段还能是…...

css更改图片颜色

css更改图片颜色&#xff0c;比较时候颜色单一的图片&#xff0c;比如logo之类的 css中的 filter 属性定义元素&#xff08;通常是 <img>&#xff09;的视觉效果&#xff08;如模糊和饱和度&#xff09; img{ -webkit-filter: invert(51%) sepia(94%) saturate(6433%) h…...