• 为什么建议使用你 LocalDateTime ,而不是 Date?
    当多个线程同时使用相同的SimpleDateFormat对象调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。
  • 为什么建议使用你 LocalDateTime ,而不是 Date?
    当多个线程同时使用相同的SimpleDateFormat对象调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。
  • Tomcat 的 NIO Connector 源码分析
    做为Tomcat容器连接外部世界的桥梁, Connector的性能决定了 Tomcat可以处理的请求数。在Tomcat7 之前,会有 BIO 这种阻塞IO的存在,用在请求连接数较少的场景。从 Tomcat 7 之后, NIO 做为默认的Connector的实现,极大的提升了应用的性能。本文将介绍 Tomcat 中的 NIO 使用,使大家对 Java NIO 的生产使用有更加直观的认识。在 Tomcat 中,使用 Connector 来处理连接,一个 Tomcat 可以配置多个 Connector,分别用于监听不同端口,或处理不同协议。如果你使用 9.0 以前的版本,Tomcat 在启动的时候是会自动配置一个 connector 的,我们可以不用显示配置。Tomcat 使用不同的 endpoint 来处理不同的协议请求,今天我们的重点是NioEndpoint,其使用非阻塞 IO来进行处理 HTTP/1.1 协议的请求。
  • 什么是读写锁?微服务注册中心是如何进行读写锁优化的?
    因为如果你出去面试,很可能被问到读写锁的问题,此时你可以自然的带出来,你之前了解过Spring Cloud微服务技术架构,同时对里面的微服务注册中心的注册表读写锁优化有一些自己的感悟和看法。这个可以参考之前写过的一篇文章微服务注册中心是如何承载大型系统千万级访问的。因为这么搞的话,相当于是所有的线程读写服务注册表数据,全部串行化了。里面分析了Spring Cloud Eureka微服务注册中心里的多级缓存机制。最后看一下,上面那段伪代码如果用读写锁来优化是怎么样的?
  • 面试还没法说透 Synchronized 底层原理?推荐看看这篇文章!
    Synchronized的作用主要有三个:确保线程互斥的访问同步代码保证共享变量的修改能够及时可见有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:  修饰普通方法  修饰静态方法  修饰代码块接下来我就通过几个例子程序来说明一下这三种使用方式1、没有同步的情况:代码段一:package com.paddx.test.concurrent;public class SynchronizedTest { public void method1(){ System.out.println; try{ System.out.println; Thread.sleep; }catch { e.printStackTrace(); } System.out.println; } publicvoidmethod2(){ System.out.println; try{ System.out.println; Thread.sleep; }catch { e.printStackTrace(); } System.out.println; } publicstaticvoidmain{ final SynchronizedTest test =newSynchronizedTest(); newThread.start(); newThread.start(); }}执行结果如下,线程1和线程2同时进入执行状态,线程2执行速度比线程1快,所以线程2先执行完成,这个过程中线程1和线程2是同时执行的。
  • Go语言出现后,Java还是最佳选择吗?
    4年前,阿里JVM团队开始自研Wisp2,将Go语言的协程能力带入到Java世界。既享受Java的丰富生态,又获得异步程序的性能,Wisp2让Java平台历久弥新。Java也因此被质疑是否不再适应最新的云场景了。下方一些名为java的线程是gc线程。为了满足上述两个条件,使用eventloop+异步callback的方式是一个极佳的选择。因此假如逻辑上要求在write后执行的代码,必须出现在回调里,write是函数的最后一行。
  • 死磕 java线程——自己动手写一个线程池
    问题自己动手写一个线程池需要考虑哪些因素?简介线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文彤哥将手把手带你写一个可用的线程池。属性分析线程池,顾名思义它首先是一个“池”,这个池里面放的是线程,线程是用来执行任务的。这是为了控制系统中线程的数量。另外,为了便于给线程池一个名称,我们再加一个变量:线程池的名称name。其次,如果运行的线程数达到了核心线程数,则把新任务入队列。
  • 精心整理了20道操作系统高频面试题(建议收藏)
    操作系统1、简单说下你对并发和并行的理解?通知后,才能进行后续的执行。时间片轮转调度算法时间片轮转调度算法主要适用于分时系统。短作业优先调度算法是一个非抢占策略,他的原则是下一次选择预计处理时间最短的进程,因此短进程将会越过长作业,跳至队列头。最短剩余时间优先调度算法最短剩余时间是针对最短进程优先增加了抢占机制的版本。优先级调度算法优先级调度算法每次从后备作业队列中选择优先级最髙的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
  • 老哥,你遇到过log4j2线程阻塞的场景吗?
    ThrowableProxy.toExtendedStackTrace内部会进行loadClass操作。并且可以看到ClassLoader的loadClass在加载类时1.首先会持有锁。可以看到当某个类被加载过了,调用findLoadedClass会直接返回,锁也会被很快释放掉,无需经过双亲委派等后面的一系列步骤。导致每次解析异常栈进行类加载时,锁占有的时间很长,最终导致阻塞。所以,当一个方法被反射调用的次数超过一定次数时,JVM内部会进行优化,使用第2种方法,来加快运行速度。JVM中只提供了两个参数,因此,没有办法完全关闭反射优化。一种能想到的接近于关闭反射优化的方法就是将inflationThreshold设为的一个特别大的数。$ java-Dsun.reflect.inflationThreshold=2147483647MyApp热文推荐看看,这些细节上的坑,你犯了多少?
  • Hashmap-大厂必备
    Hashmap在大厂面试中属于必考的内容,今天花了一个下午看了它的源码,不得不说,真的很经典。我认为看hashmap的源码是有必要的,它的底层有很多的优秀的数据结构的应用,比如说红黑树、哈希、数组+链表。HashMap的定义:Implementation based on a hash table. Provides constant-time performance for inserting and locating pairs. Performance can be adjusted via constructors that allow you to set the capacity and load factor of the hash table.是以哈希数据结构实现的,用来作为hashtable的代替品,在插入和定位元素时表现的很好,通过设置容量和装载因子来调节大小。
  • 无线程不编程,Java线程面试题
    Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。比如,先行发生关系确保了:线程内的代码能够按先后顺序执行,这被称为程序次序规则。一个线程的所有操作都会在线程终止之前,线程终止规则。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。Java提供了很丰富的API但没有为停止线程提供API。
  • 让人头大的各种锁,从这里让你思绪清晰
    Java中的锁Java中的锁准确的来说也是为了保证安全,不过不同的是Java中的锁是为了保证并发所需要的。在Java中提供了各式各样的锁,每种锁都有其自身的特点和适用范围。在Java中悲观锁的实现有synchronized关键字和Lock的实现类都是悲观锁。我们看一下乐观锁的执行过程CASCAS算法是一种无锁算法,是Java提供的非阻塞原子性操作。CAS通过硬件保证了比较更新的原子性,在JDK中Unsafe提供了一系列的compareAndSwap*方法,这里就不深究Unsafe这个类了。这就是经典的ABA问题。同时CAS还有循环开销大的问题,因为会一直循环直到预期和内存相等修改成功。因为CPU唤醒阻塞线程的开销比非公平锁大。
  • 从实践角度重新理解 BIO 和 NIO
    实现一个简易单线程服务器要讲明白BIO和NIO,首先我们应该自己实现一个简易的服务器,不用太复杂,单线程即可。为什么使用单线程作为演示因为在单线程环境下可以很好地对比出BIO和NIO的一个区别,当然我也会演示在实际环境中BIO的所谓一个请求对应一个线程的状况。这就是BIO的非常重要的一个特点,BIO会产生两次阻塞,第一次在等待连接时阻塞,第二次在等待数据时阻塞。BIO在单线程条件下BIO的弱点在上文中,我们实现了一个简易的服务器,这个简易的服务器是以单线程运行的其实我们不难看出,当我们的服务器接收到一个连接后,并且没有接收到客户端发送的
  • 从今天起,我不再使用 Java Date了!
    当多个线程同时使用相同的SimpleDateFormat对象调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。
  • Arthas - Java 线上问题定位处理的终极利器
    前言在使用Arthas之前,当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof 等一通操作。而现在,大多数的常见问题你都可以使用Arthas轻松定位,迅速解决,及时止损,准时下班。运行时或者运行之后要选择要监测的 Java 进程。在出现ArthasLogo 之后就可以使用命令进行问题诊断了。
  • 跨平台技术演进及Flutter未来
    于是Flutter提出自带渲染引擎的解决方案,尽可能减少不同平台间的差异性, 同时媲美原生的高性能体验,因此业界对 Flutter有着极高的关注度。面对现有的如此多跨平台方案,为何当下最火的跨平台技术是Flutter,有哪些优势呢?同样地,Flutter引擎在某一个官方版本对动态化
  • 同事没正确使用redis,把我害苦了...
    首先发现开发的本地ide没有发现问题,应用卡死时候数据库,redis都正常,并且无特殊错误日志。为了保护事故现场 先 dump了问题进程所有堆内存,然后debug模式重启测试环境应用,打算问题再显时直接远程debug问题机器。第二天问题再现,于是通知运维nginx转发拿掉这台问题应用,自己远程debug tomcat。这时候有点懵逼,冷静了一会,在入口之前的aop地方下了个断点,再debug一次,这次进了断点,f8 N次后发现在执行redis命令的时候卡主了。继续跟,最后在到jedis的一个地方发现问题:/** * Returns a Jedis instance to be used as a Redis connection. The instance can be newly created or retrieved from a * pool. * * @return Jedis instance ready for wrapping into a {@link RedisConnection}. */protected Jedis fetchJedisConnector() { try { if (usePool && pool !
  • 为什么阿里巴巴要禁用Executors创建线程池?
    通过线程池复用线程有以下几点优点:减少资源创建 => 减少内存开销,创建线程占用内存降低系统开销 => 创建线程需要时间,会延迟处理的请求提高稳定稳定性 => 避免无限创建线程引起的OutOfMemoryErrorExecutors创建线程池的方式根据返回的对象类型创建线程池可以分为三类:创建返回ThreadPoolExecutor对象创建返回ScheduleThreadPoolExecutor对象创建返回ForkJoinPool对象本文只讨论创建返回ThreadPoolExecutor对象ThreadPoolExecutor对象在介绍Executors创建线程池方法前先介绍一下ThreadPoolExecutor,因为这些创建线程池的静态方法都是返回ThreadPoolExecutor对象,和我们手动创建ThreadPoolExecutor对象的区别就是我们不需要自己传构造函数的参数。
  • 阿里面试官鬼得很,问我为什么他们阿里要禁用Executors创建线程池?
    # 写在前面首先感谢大家在盖楼的间隙阅读本篇文章,通过阅读本篇文章你将了解到:线程池的定义Executors创建线程池的几种方式ThreadPoolExecutor对象线程池执行任务逻辑和线程池参数的关系Executors创建返回ThreadPoolExecutor对象OOM异常测试如何定义线程池参数如果只想知道原因可以直接拉到总结那# 线程池的定义管理一组工作线程。
加载中...
公众号