-
死锁发生时,Thread.dumpStack()和jstack能看到什么线程卡住不动、CPU低、请求堆积,但日志没报错——这时候大概率是死锁。Java自身会检测到部分循环等待并自动记录,但只限于「互相持有对方需要的锁」这种经典场景。jstack输出里如果出现Found1deadlock.,下面跟着的线程栈就是关键证据:你会看到两个(或多个)Thread都停在Object.wait()或Unsafe.park(),且各自持有一个锁、又在等另一个锁。注意:Thread.dumpSt
-
多态必须依赖继承和封装:继承提供父类引用指向子类对象的可能,封装通过访问控制确保方法可被重写与安全调用;二者缺一不可,否则无法实现运行时动态绑定。
-
运行java-version输出版本号即配置成功;否则检查JAVA_HOME路径是否指向JDK根目录、PATH是否包含%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(macOS/Linux),并确认终端已重启或执行source刷新配置。
-
观察者模式解决对象间一对多依赖更新,核心是状态变更通知;策略模式解决算法动态替换,核心是算法可插拔。二者职责分明,可组合使用但不可混淆边界。
-
WebSocket连接后收不到弹幕,主因是Session被意外关闭;需检查isOpen()、避免异步未发送、禁用轮询改用SimpMessagingTemplate;弹幕时间应服务端归一化为offsetMs;高并发广播改用CopyOnWriteArraySet;XSS防护须后端白名单过滤。
-
do-while循环至少执行一次,因条件判断在循环体之后;适用于先执行后判断的场景,如用户输入校验、重试逻辑;不适用于需跳过首次执行的计数循环。
-
Arrays.asList返回的List不可增删、不拆包基本类型数组、与原数组共享内存,仅适用于只读场景;安全用法仅有直接传引用类型字面量或明确接受联动视图。
-
可以,Java抽象类中能定义main方法。由于main方法是静态的,JVM可直接调用,无需实例化类,因此即使在抽象类中也能作为程序入口正常运行并执行子类实例创建等操作。
-
多态通过继承和方法重写实现,允许父类引用调用子类方法,运行时根据实际对象类型动态绑定,提升代码扩展性与灵活性,支持接口实现和对象替换,遵循“编译时看类型,运行时看对象”原则。
-
Properties.load()默认用ISO-8859-1解码导致中文乱码,应使用InputStreamReader指定UTF-8;getProperty()返回null多因加载失败、等号非ASCII或含不可见字符;System.getProperties()与自定义Properties无关,需显式调用System.setProperty()才能生效。
-
左移<<等价于乘2的幂但需防溢出,右移>>算术右移保留符号位,>>>无符号右移补0,位移量对类型长度取模,运算符优先级低于加减需加括号。
-
@Override报错是因为方法签名未严格匹配父类或接口:方法名、参数类型/顺序、返回类型(协变除外)、异常声明须一致;常见于参数类型不等价、访问权限降级、误覆写static方法或泛型擦除导致的签名不匹配。
-
必须用synchronized而非volatile的场景是需保证复合操作原子性时,如i++、多变量协同更新(如银行转账),因volatile不保证原子性,而synchronized可锁住整个临界区确保串行执行。
-
使用ConcurrentHashMap、Future+Callable、ReadWriteLock或Caffeine等方案可实现Java线程安全缓存。1.ConcurrentHashMap适用于高并发读写场景,通过分段锁或CAS保证线程安全;2.Future方案结合原子操作避免多线程重复计算,提升性能;3.ReadWriteLock提供读写锁分离,适用于强一致性要求的批量更新;4.推荐使用Caffeine或GuavaCache等成熟库,内置线程安全与自动加载机制,简化开发。核心是避免竞态条件并控制读写互斥
-
Swing记事本应使用JFrame+JTextArea+JScrollPane搭建,设换行、用DocumentListener监听修改、统一UTF-8编码读写、区分“保存”与“另存为”逻辑并维护currentFile字段。