1. 线程饥饿死锁
指由于没有线程来执行任务造成的死锁。如果一个线程池所执行的任务之间存在依赖,并且线程池的线程数量少的话很容易出这种问题。
例如一个线程池的线程数量为1,提交两个任务。此时任务A正在执行,但是任务A需要等待任务B执行后A才可以结束,这时候由于只有一个线程,所以B也会等待A的执行完毕,如此就造成了线程饥饿死锁。
2. Java泛型
java泛型是通过类型擦除实现的,不管指定什么类型,最后都是object,所以基本类型无法设置为泛型,但可以使用包装类。还有,反射可以破坏泛型,所以要慎用反射。
3. 活锁
不断地重试不断地失败,也是一种活跃性问题
4. jar包注册成服务(nssm)
- 写一个bat文件,java -jar xxx.jar
- 进入nssm工具,执行nssm install 服务名,会弹窗
- 在弹窗选择刚才的bat文件,确认即可,服务已注册成功
5. spring的HandlerInterceptor接口
HandlerInterceptor是Spring框架提供的一个接口,用于在处理请求的过程中拦截和处理请求。它可以在请求到达Controller之前和之后执行一些额外的逻辑。要使用HandlerInterceptor,需要创建一个实现了该接口的拦截器类,并在Spring配置文件中进行配置。
HandlerInterceptor接口定义了三个方法:
- preHandle
方法在请求到达Controller之前被调用。它返回一个布尔值,用于指示是否继续处理请求。如果返回true,则继续执行后续的拦截器和Controller;如果返回false,则终止请求处理流程,不再继续执行后续的拦截器和Controller。
- postHandle
方法在Controller处理完请求后、视图渲染之前被调用。可以在这个方法中对请求进行一些处理,比如修改ModelAndView对象,添加一些公共的模型数据等。
- afterCompletion
方法在整个请求处理完成后被调用,即在视图渲染完成后调用。可以在这个方法中进行一些资源清理操作,比如释放打开的数据库连接、删除临时文件等。
6. log.isDebugEnabled()等方法
是一个用于判断日志记录器(logger)是否启用了调试级别的方法。在许多日志记录框架中,包括常见的Java日志库如Log4j和Slf4j,都提供了类似的方法。通过使用log.isDebugEnabled()方法,可以在编写日志语句之前判断当前日志记录器是否启用了调试级别
说白了,就是记录日志之前可以判断一下,再决定是否记录日志或执行一些操作
7. 读取txt文件
public class ReadTextFile {
public static void main(String[] args) {
String filePath = "your_file_path_here";
// FileInputStream是InputStream类的子类,用于从文件中读取字节数据
try (FileInputStream fileInputStream = new FileInputStream(filePath);
// InputStreamReader是Reader类的子类,用于将字节流转换为字符流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
// BufferedReader是Reader类的子类,用于高效地读取字符流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
8. java输出流可以先close再flush吗?
乍一看觉得很脑残,但其实还真行。
输出流的close()方法会自动调用flush()方法,因此在大多数情况下,不需要显式地调用flush()方法。
9. mysqldump
一直以为是navicat提供的功能呢,原来是mysql客户端啊。mysqldump.exe 是 MySQL 数据库管理工具中的一个程序,用于备份(导出)MySQL数据库的数据和结构。它允许你将数据库的内容导出为一个 SQL 脚本,该脚本包含创建表、插入数据以及其他数据库对象的定义,从而使得可以在需要的时候重新创建数据库或者将数据恢复到原始的数据库。
功能也多种多样,基本上navicat上的操作都可以写命令实现。例如:备份整个数据库、备份特定表、备份结构、从备份还原数据库==
默认情况下,mysqldump.exe 不会在事务中执行,而且对于每个表,它会执行一条 LOCK TABLES 语句来锁定表以保证一致性。如果你希望备份过程中不锁定表并且使用事务来确保备份的一致性,可以使用 --single-transaction 选项,整个备份过程都将会在事务中执行。但请注意, --single-transaction 只对支持事务的存储引擎生效,对于不支持事务的引擎仍然会使用表锁定。
10. springAOP和aspectj
一直以为项目里用的是spring的aop,今天才发现是aspectj的
-
Spring AOP 是 Spring 框架提供的 AOP 实现,它基于动态代理,主要用于 Spring 容器中的 Bean。
-
Spring AOP 默认使用 JDK 动态代理,所以只能代理实现了接口的目标对象。当目标对象没有实现接口时,Spring 会切换到使用 CGLIB 字节码增强。CGLIB主要通过继承目标类来实现代理。
-
Spring AOP 面向切面编程的特点是集成性和方便性,它与 Spring 的 IOC 容器无缝集成,通过配置或注解就可以实现简单的 AOP 功能,例如在方法执行前后添加日志、事务控制等。
-
AspectJ 是一个功能强大的独立 AOP 框架,它提供了比 Spring AOP 更为高级的 AOP 功能,并且不依赖于 Spring 框架。AspectJ 可以直接在 Java 源码中定义切面,通过编译器或者字节码增强实现 AOP。
-
AspectJ 可以对任何类进行增强,无论是否实现了接口。它支持更为细粒度的切入点表达式,提供了更多的切入点选择,例如 call()、get()、set() 等。
-
AspectJ 的功能非常丰富,可以处理更复杂的 AOP 场景,但同时也需要更多的配置和学习成本。
11. java动态代理原理
接口,接口还是接口,把接口玩明白就懂了。
12. jsp中fn:contains
<c:if test="${fn:contains(str1, str2)}"> 字符串str1包含字符串str2 </c:if>
jsp页面循环用于判断是否包含特定字符串的,头一次觉得写jsp也有点意思,记录一下,可能是最近工作很无聊吧
13. java安全管理器SecurityManager(一项过时的技术)
Java的安全管理器(Security Manager)是Java安全机制的一部分,它允许在Java应用程序中对代码执行进行安全性检查。安全管理器在Java运行时对敏感操作进行权限检查,以保护系统的安全性和稳定性。
安全管理器是java.lang.SecurityManager类的子类的实例,它可以通过System.setSecurityManager设置。如果未设置安全管理器,则默认为null,即不启用安全管理器。
安全管理器的主要功能包括:
- 权限检查:安全管理器可以检查代码是否具有执行某个操作(例如访问文件、创建网络连接等)所需的权限。如果代码没有相应的权限,安全管理器将抛出SecurityException,阻止操作的执行。
- 类加载控制:安全管理器可以限制类的加载,防止不信任的代码加载敏感类或系统类。
- 线程组控制:安全管理器可以控制线程的创建和操作,确保线程行为符合安全策略。
- 系统资源访问控制:安全管理器可以阻止代码访问某些系统资源,如文件系统、网络等,从而限制了恶意代码对系统的影响。
使用安全管理器的目的是增加Java应用程序的安全性,特别是在运行未受信任的代码时。它对于在Applet、Java Web Start和Java安全沙箱等场景下尤其有用,因为这些场景需要对执行代码进行严格的安全检查。
需要注意的是,在现代Java应用程序中,并不常用安全管理器,因为很多应用程序不再运行在沙箱环境中。在这种情况下,通常不会设置安全管理器。同时,Java 9引入的模块系统默认禁用了获取调用者的类信息,从而增强了安全性。因此,对于大多数现代Java应用程序,使用其他更现代的安全机制和框架可能更合适。