导航栏

java

目录

线程

原子操作类

内部使用cas+自旋锁的方式,是乐观锁,比传统的同步悲观锁更加有效率(reentrantLock和synchronized)

AtomicInteger

原子操作类AtomicInteger详解

AtomicReference

参考链接
原子类型:AtomicReference详解

锁的类型

自旋锁

偏向锁

轻量级锁

使用cas+自旋锁,线程进行不断地自旋,当竞争线程过多时自旋次数会变多,当超过一定限度时就会转入重量级锁,否则将会过度的消耗系统资源

重量级锁

  • 悲观锁,阻塞同步,互斥锁
  • 适用于同步代码块的竞争很激烈(线程的竞争很激烈)的情况
  • 系统开销很大,因为要从用户态转为内核态,所以适用于竞争激烈的情况
  • 注意
    synchronized关键字并非一开始就加上重量级锁,也是从偏向锁,轻量级锁,重量级锁依次变化的过程

重量级锁 synchronized
偏向锁、轻量级锁、重量级锁的理解 及适用场景

可重入锁

公平锁

  • 不根据阻塞队列中线程的顺序而被唤醒,获得锁
  • 等待时间最长的线程先运行,即先进先出

非公平锁

  • 根据先进先出的队列规则被唤醒,获得锁

常用的实现锁的方式

ReentrantLock

  • 是一个实现了Lock接口的类
  • ReenTrantLock可以选择非公平锁 false公平锁 true
  • 是可重入锁
  • 默认为非公平锁
  • 需要手动的释放和获取锁
  • 不要将获取锁的过程写在try块中,因为如果获取锁时发生了异常,异常抛出的同时也会导致锁无故释放

源码分析

  • 实现可重入
    Sync为ReentranLock的一个抽象静态内部类,继承了AQS(AbstractQueuedSynchronizer),而AQS中的state变量用于实现可重入
  • 实现公平与非公平
    Sync有两个具体的实现类:NofairSync和FailSync用于实现公平与非公平

使用

ReentantLock比synchronized增加了三大功能

1、等待可中断:等待可中断是指当持有锁的线程长期不释放锁,那么正在等待的线程可以选择放弃等待,转而处理其它事情。可中断的特性对于处理执行时间非常长的同步块有很好的帮助。
2、公平锁:公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来获得锁,可以理解为操作系统中的先来先服务。synchrnized是非公平锁,任何一个等待锁的线程都有可能获得锁,ReentrantLock默认情况下也是非公平的,但是可以通过构造函数来设定使用公平锁。
3、锁可以绑定多个条件:锁可以绑定多个条件是指ReentrantLock可以绑定多个Condition对象,而在synchronized中,锁对象的wait()、notify()、notifyAll()方法可以实现一个隐含的条件,如果要和多个条件进行关联时,就不得不多添加锁,而ReentrantLock则无需这样做,只需要多次调用newCondition()方法就可以实现。

Condition

  • 和ReentrantLock搭配使用,可以有多个condition,常用于多个线程的交替执行,即进程间的相互通信
复制private static void alternateTask() {
        ReentrantLock lock = new ReentrantLock();
        Condition condition1 = lock.newCondition();
        Condition condition2 = lock.newCondition();
        Thread thread1 = new Thread(() -> {
            try {
                lock.lock();
                for (int i = 65; i < 91; i++) {
                    System.out.println("----------thread1------- " + (char) i);
                    condition1.signal();
                    condition2.await();

                }
                condition1.signalAll();
            } catch (Exception e) {
            } finally {
                lock.unlock();
            }
        });
        Thread thread2 = new Thread(() -> {
            try {
                lock.lock();
                for (int i = 0; i < 26; i++) {
                    System.out.println("----------thread2------- " + i);
                    condition2.signal();
                    condition1.await();
                }
                condition2.signalAll();
            } catch (Exception e) {
            } finally {
                lock.unlock();
            }
        });
        thread1.start();
        thread2.start();
    }

synchronized

  • 独占锁
  • 可重入
  • 非公平锁
  • ReentrantLock.Condition是在粒度和性能上都优于Object的notify()、wait()、notifyAll()线程通信的方式。

String的方法

String.format()

String.indexOf()

String.valueOf(Object)

  • 再toString的基础上对Object是否为null进行判断,如果为null则直接返回为null的字符串

toString()

工具类

System

System.arraycopy(Object src,int srcPos, Object dest, int destPos, int length)

  • src:被拷贝的数组
  • srcPos:从被拷贝的数组的哪个位置开始拷贝
  • dest:目标数组(想要获取拷贝数据的数组)
  • destPos:被覆盖的数据的起始位置,即从哪个位置粘贴拷贝到的数据
  • length:被覆盖的数据的长度,
int arr1[] = {0,1,2,3,4,5};
int arr2[] = {0,10,20,30,40,50,60,70,80};
System.arraycopy(arr1,0,arr2,1,arr1.length);
System.out.println(arr2);
Arrays.stream(arr2).forEach(System.out::println);

Collections

Collections.unmodifiableList(list)

将一个List变为不可变列表

Arrays

Objects

关键字

transient

  • 变量被transient修饰后,变量不再是对象持久化的一部分,该变量内容在序列化后无法被访问,即序列化后的值为空
  • transient只能修饰变量,不能修饰方法和类
  • :static修饰的变量也不可被序列化
  • Java中transient关键字的详细总结

Java类的三大特性总结

什么是java的多态

java集合

java集合超详解

多线程并发和并行的区别

Integer和int的区别?在什么时候用Integer和什么时候用int

重构和重写和重载

Double为什么会丢失精度?解决方法?

(https://cloud.tencent.com/developer/article/1468551)
double的问题是从小数点转换到二进制丢失精度,
BigDecimal在处理的时候把十进制小数扩大N倍让它在整数上进行计算,并保留相应的精度信息

Object的9个方法

(https://blog.csdn.net/qq_33098049/article/details/82664061)

线程、进程

进程与线程的概念、区别和联系

java多线程同步方法

java多线程同步5种方法
Java并发编程:Synchronized及其实现原理

java使用多线程的几种方式和对比

线程的生命周期相关

JAVA面试题 线程的生命周期包括哪几个阶段?
Java线程生命周期以及方法详解

volatile关键字实现变量在线程间的同步功能,当一个线程更改了变量的值,volatile保证该值立刻被同步到主存中,在获取该变量值时也从主存中进行刷新。
sycnalized关键字实现函数及类的同步,volatile实现变量的同步

线程池

Java多线程之线程池
四种线程池拒绝策略

java的sleep、wait、yield、方法

Java线程sleep,yield,join,wait方法详解
Java中Wait、Sleep和Yield方法的区别

死锁产生的四个必要条件

锁升级过程

关于 锁的四种状态与锁升级过程 图文详解

java IO

输入网址到网页显示的过程

(https://blog.csdn.net/u014527697/article/details/79340386)
Dns解析–>端口分析–>tcp请求–>服务器处理请求–>服务器响应–>浏览器解析—>链接关闭

如何提升服务器的响应速度

比较hashTable、hashMap、ConcurrentHashMap的查询速度

ConcurrentHashMap和HashTable都是线程安全的,ConcurrentHashMap的查询效率要高于HashTable
hashMap是线程不安全的

重载和重写

静态方法能够发生重载,不能重写
重载是在一个类进行的

List、map、set存取元素时,各有什么特点?

https://blog.csdn.net/zhong8888888800/article/details/105884109

简述HashMap的实现原理

https://blog.csdn.net/weixin_45302751/article/details/108337701
https://www.cnblogs.com/xwdreamer/archive/2012/05/14/2499339.html

用Java实现简单的Map遍历示例

一条sql执行过长的时间,你如何优化,从哪些方面

https://www.cnblogs.com/waitmoon/p/13799887.html
http://www.javashuo.com/article/p-dzxmtkyl-hx.html

随便说几个单例模式,并写一种线程安全的

https://blog.csdn.net/LZ15932161597/article/details/91876527

扫描指定文件夹下所有以.txt结尾的文件,输出其绝对路径

https://blog.csdn.net/ademen/article/details/84086707

Java中抽象类和接口各自的使用场景

https://blog.csdn.net/cjhc666/article/details/61926719
https://www.cnblogs.com/weiweiwei/p/13995174.html

spring依赖注入的方式有

https://blog.csdn.net/baidu_32739019/article/details/83657760

数组是对象吗?是

https://www.cnblogs.com/syxy/p/12347062.html

tomcat配置-修改tomcat默认的8080端口

https://blog.csdn.net/HRM108/article/details/78658894

数组属于一种原生类吗?

数组是一种对象不属于原生类
原生类有8种, int double boolean float byte short long char

finally中能够使用break和return吗

finally块中不允许使用return,continue或break的原因

锁有哪些类型?

https://blog.csdn.net/qq_22985751/article/details/79567157

单例模式有哪些

https://blog.csdn.net/LZ15932161597/article/details/91876527

session的生命周期

默认为30分钟
https://www.cnblogs.com/lukelook/p/11095113.html

关于==在Strin中的等值判断

String a="abc";
String b = "a"+new String("bc");
String c = "abc";
System.out.println(ac);
System.out.println(a
b);
System.out.println(a.equals(b));
结果为:
true
false
true

算法

各种排序以及查找算法的时间复杂度

Redis相关

Redis笔记二之Redis命令操作简介及五种value数据类型

分布式锁之Redis实现

redis面试题

消息队列

posted @   RickZ  阅读(6)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
点击右上角即可分享
微信分享提示