您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   在Java NIO的三大核心中,除了Channel和Buffer,剩下的就是Selector了。有的地方叫它选择器,也有叫多路复用器的(比如Netty)。 之前提过,数据总是从Channel读取到Buffer,或者从Buffer写入到Channel,单个线程可以监听多个Channel——Selector就是这个线程背后的实现机制(所以得名Selector)。       Selector通过控制单个线程处理多个Channel,如果应用打开了多个Channel,但每次传输的流量都很低,...

  3EPyMqobg2PT   2023年11月01日   77   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括: 1、T1:创建(启动) 2、T2:运行(行驶) 3、T3:销毁(停车) 而T1+T3的开销(汽油或者时间)是要远大于T2的。所以,即使是性能再好的车,或者性能再好的计算机,如果经常有T1+T3的操作存在,那么显然是扛不住的。 所以,为了解决这种因为切换不同线程导致的效率问题,Java推出了线程池技术。通过...

  3EPyMqobg2PT   2023年11月01日   65   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   除了可以通过ThreadPoolExecutor自定义线程池外,同StreamAPI中的Collectors一样,多线程里的Executors类也提供了一组相关的线程池工具,可以直接拿来用,不用考虑用什么队列合适的问题。 Javac除了传统的四大线程池工具: 1、newFixedThreadPool定长线程池 2、newCachedThreadPool缓存线程池 3、newSingleThreadExecutor单线程线程池 4、newScheduledThreadPool任务调度线程池 还包括了Java8新增的newWor...

  3EPyMqobg2PT   2023年11月01日   55   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着创造了线程池ThreadPool。就这样就可以了吗?——不,工程师们并不满足于此,他们不把自己创造出来的线程给扒个底朝天决不罢手。 有了线程关键字解决线程安全问题,有了线程池解决效率问题,那还有什么问题是可以需要被解决的呢?——还真被这帮疯子攻城狮给找到了! 当多个线程共享同一个资源的时候,为了保证线程安全,有时不得不给资源加锁,例如使用Synchronized关键字实现同步锁。这本...

  3EPyMqobg2PT   2023年11月01日   33   0   0 Java

  您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~     在JDK1.5之前,Java的多线程都是靠synchronized来保证同步的,这会引起很多性能问题,例如死锁。但随着Java的不断完善,JNI(JavaNativeInterface)使得Java能越过JVM直接调用本地方法,例如CAS。 CAS是CompareAndSwap(比较与交换)的缩写,它用于实现多线程同步的原子指令,允许算法执行读-修改-写操作,而无需担心其他线程同时修改变量。说人话,意思就是它的操作过程足够细微,以至于线程都奈何不了它。 所谓原子指令就是指不会被线程调度机制打断的操...

  3EPyMqobg2PT   2023年11月01日   118   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   在Java面试中,有一类高频问题会经常问到(火箭式问题):Java有几种锁?都是干嘛的?我想对于面试经验较为丰富的人,这个问题极有可能遇到过。不过我估计除了「死锁」大部分人都听过以外,其他的什么锁可能就不是那么清楚了。实际上,Java总共有6大类14种锁(不同的人对锁的理解不同,可能分类和数量会不太一样,这个无关紧要):     与锁相关的类继承结构:     首先,是悲观锁和乐观锁。 1、悲观锁:包括synchronized关键字和Lock类,适合写操作多的场景 2、乐观锁:包...

  3EPyMqobg2PT   2023年11月01日   107   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   Java中的AQS(AbstractQueuedSynchronizer,抽象队列同步器)是用来实现锁及其他同步功能组件的Java底层技术基础,java.util.concurrent包下大部分类的实现都离不开它。 通过继承AQS: 1、ReentrantLock的内部类实现了公平锁和非公平锁; 2、CountDownLatch的内部类实现了发令枪; 3、ReentrantReadWriteLock的内部类实现了独享锁和共享锁; 4、Semaphore的内部类实现了公平锁和非公平锁。 AQS主要实现两大功能:独占(Exclu...

  3EPyMqobg2PT   2023年11月01日   48   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现。既然它这么优秀,是骡子是马,就拉出来溜溜吧。 首先用重入锁来实现简单的累加,就像这样: /用重入锁实现累加@author湘王/ publicclassMyLockTest{privatefinalLocklock=newReentrantLock();privateintvalue;publicintgetNext(){lock.lock();try{value;}finally{lock.unlock();}returnvalue;}publicstaticv...

  3EPyMqobg2PT   2023年11月01日   37   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了。而要想用好多线程,其实是可以取一些巧的,比如JUC(好多面试官喜欢问的JUC,就是现在要讲的JUC)。JUC就是java.util.concurrent的首字母缩写,它是Java并发工具包就是中提供的各种工具类的统称,主要分为几大类: 1、同步器; 2、线程安全的容器; 3、阻塞队列; 4、一些特殊的类。 他们都有各自适合应用场景。这里是并发工具包相关类的继承结构:  ...

  3EPyMqobg2PT   2023年11月01日   75   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   除了四种常见的同步器(发令枪、摇号器、栅栏和交换机),JUC还有所谓线程安全的容器、阻塞队列和一些特殊的类。其中常出现的就是线程安全的容器和阻塞队列。与其说这是两个大的分类,还不如说它就是两个用得最多的类:ConcurrentHashMap和ArrayBlockingQueue。 我的风格是尽量少讲原理,多讲实际生活中的案例,除非它非常重要,就像AQS,这玩意绝对是个重量级的神器,差不多整个JUC都是建立在它之上的。如果说学习多线程只有一次集中全部精力的机会的话,那我绝对建议把这份宝贵的精力花在AQS上,物超所值。至于搞明白...

  3EPyMqobg2PT   2023年11月01日   120   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   从之前的Lambda表达式的演变过程可以知道,Lambda表达式其实是一个对匿名内部类的简化过程:去掉了多余的语法修饰,只保留最最核心的部分。在Java中类似这种使用匿名内部类写代码的场景非常多,比如Runnable接口,就是典型的最好使用Lambda表达式的地方。例如这样的代码:       可以清除地看到代码的简化过程。 所以Lambda表达式的特点在于: 1、匿名:像匿名函数一样,没有名字,只有代码块 2、函数:基于接口函数执行,而不是类 3、行为:传递行为,而非封装代码 很多刚开始学习...

  3EPyMqobg2PT   2023年11月01日   90   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   Lambda表达式虽然将接口作为代码块赋值给了变量,但如果仅仅只是Lambda表达式,还无法让Java由量变引起质变。真正让Lambda能够发挥出巨大威力的,就是流式计算。 所谓流式计算,就是让数据像在流水线上一样,从一道工序流转到下一道工序。就像这样:         如果把数据处理的方式比作流水线,那么Spark、Storm和Flink就是目前市面上头部的三家工厂。它们有各种各样的数据装配间(也就是各种处理数据的算子),将数据按照所需加工成型。所以,不懂流式计算根本就做不了大数据...

  3EPyMqobg2PT   2023年11月01日   34   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   多数码农在开发的时候,要么处理同步应用,要么处理异步。但是如果能学会使用CompletableFuture,就会具备一种神奇的能力:将同步变为异步(有点像用了月光宝盒后同时穿梭在好几个时空的感觉)。怎么做呢?来看看代码。 新增一个商店类Shop: /商店类@author湘王/ publicclassShop{privateStringname="";publicShop(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetNa...

  3EPyMqobg2PT   2023年11月01日   160   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   前面把Java函数式编程的由来和最主要的核心知识点讲完了。包括比较难懂的Lambda表达式是怎么演变而来的也全部都撸了一遍。Lambda表达式这种编程方式的确是让人不太习惯,尤其是之前那种纯面向对象编程的思维模式一旦建立起来之后,想要再接受这种比较奇怪的语法和编程模式,确实是非常困难。但Lambda表达式和流式编程的出现,又催生了另一门新的技术:反应式编程。 《三国演义》中说:“天下大势,分久必合,合久必分”。在科技领域也是一样。之前没有科学的时候,由占星术、炼金术、神学等催生出了一系列的自然科学,像什么物理、化学、数学等等...

  3EPyMqobg2PT   2023年11月01日   36   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   看了前面对反应式编程的说明,可能很多人都会打退堂鼓了。Lambda都已经够难理解的了,又来了一个反应式编程!实在卷不动了~ 其实很好肝。 就像之前学习编程,或者说学习Java的同学,也不是全都要把面向对象编程OOP搞懂了才能往下学的吧,之前的OFP也是一样,现在轮到ORP这种编程范式也还是这样的,比如我们可以到Github上看有关反应式编程的资料:         右边是目录,包括一些概念性的介绍,还有各种文档,包括最主要的操作符。而且为了降低学习的难度,官方还特意提供了大量的示例代...

  3EPyMqobg2PT   2023年11月01日   39   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   在前面的文章中已经把vert.x框架给跑起来了,但是实际开发中服务端是需要响应客户端的请求的,所以肯定需要增加接口,但是该怎么加呢?有的人倾向于去搜索引擎找答案,其实还有一个比较好的方式是去官网看看有啥可以用的资料,比如说打开反应式编程的官网就能直接找到最新最准确的文档:       可以看到,点击进入【Vert.xWeb】之后,再在左边浏览,然后点击【RoutingbyHTTPmethod】:       为了节约大家的时间,我就直接把代码展示出来了。 先创建...

  3EPyMqobg2PT   2023年11月01日   48   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   自从Java在2009年被Oracle收购之后,就不再开源,除了Oracle官方发布的版本之外,还有OpenJDK版本,这两者的区别可以自行找某度去搞明白。对于没有几千万用户的应用来说,OpenJDK已经足够了,即使是一些大厂,内部系统用OpenJDK也足够了。 从Java8开始,整个JDK就一直在致力于不断改进,不断融合新的开发特性。Java目前始终保持前向兼容,所以如果有新的稳定版JDK出来,就可以立即使用新的JDK,尝试一些新特性,而不必担心不兼容的问题(可能个别地方有改动,但对个人及小型开发来说可以忽略不计)。 先做...

  3EPyMqobg2PT   2023年11月01日   36   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   虽然到目前为止Java的版本更新还没有什么惊天动地的改变,但总是会冒出一些有趣的小玩意。前面列举了Java9和Java10的一些特色,现在接着来撸一撸Java11之后的新奇特。 Java9更新了Http 2Client,也说过先不着急看,因为在后续版本中语法会变。这不,到Java11就实现了。最直接的变化就是http相关包名由Java9的jdk.incubator.http改为Java11的java.net.http。感觉java.net.http才像那么回事,incubator是个啥呢?好像完全和http不沾边。...

  3EPyMqobg2PT   2023年11月01日   41   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   虽然说互联网是一个非常开发、几乎没有边界的信息大海,但说起来有点奇怪的是,每个稍微有点规模的互联网应用都有自己的权限系统,而权限的本质却是是封闭的——开放的互联网有着封闭的权限。 现在做Java后端应用开发用的都是Spring框架,但在Spring诞生之前,却是Servlet的天下,都是根据业务规则各自实现自己的Servlet。权限系统也是一样,在没有统一的权限系统规范之前,各个Java业务系统都是根据需求自己实现对功能的授权管理。这种早期的权限系统称之为ACL(AccessControlList,访问控制列表)。等发展到一...

  3EPyMqobg2PT   2023年11月01日   35   0   0 Java

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   前面运行写好的代码之所以没有任何显示,是因为还没有对SpringSecurity进行配置,当然啥也不显示了。这就好比你坐在车上,却不打开发动机,车子当然跑不起来。所以咱们就来让它跑起来。不过在配置之前,有必要对SpringSecurity的登录流程做个大致了解。 如果深入源码去了解,这个玩意及其复杂,但是没必要,知道它的机制就行了。就好比你买车也不必把发动机拆开去看它是怎么工作的吧。简单来说它就是下面这些步骤: 1、SpringSecurity通过AuthenticationManager接口进行身份验证 2、Provide...

  3EPyMqobg2PT   2023年11月01日   61   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~