Java中间件(1)--分布式系统&中间件从入门到精通(五)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Java中间件(1)--分布式系统&中间件从入门到精通(五)

上篇文章说了,当业务数据量大的时候,可以考虑业务和数据分离,当还解决不了的时候,可以考虑把数据库读写分离,缓存,还可以考虑把表垂直拆分,水平拆分。

大型网站架构(2)--分布式系统&中间件从入门到精通(四)


中间件为软件应用提供了操作系统所提供的服务之外的服务,中间件不是操作系统的一部分,也不是数据库的一部分,而是让软件开发者方便的处理通信输入和输出。

我的理解中间件主要分为三大类,当然这三大类肯定没有涵盖业内所有的中间件。

  1. 远程访问时候的中间件,只要解决分布式环境互相访问问题。
  2. 消息中间间:只要解决异步,解耦,削峰。
  3. 数据库访问的中间件,主要提升数据库读写性能。


构建java中间件


认识java中间件,我们要先谈下jvm—跨平台的java运行环境。Java诞生时候口号就是“write once,run anywhere”,能达到这个目标的关键点就是java虚拟机,不同的平台有不同的java虚拟机,但不同java虚拟机识别的是统一格式的中间代码,也就是我们常说的java字节码(java byte code)。


使用jvm就不得不说垃圾回收,java虚拟机是通过垃圾回收的方式进行内存回收的,而不是和c++那样通过代码进行释放,而在java虚拟机中,设置不同的垃圾回收方式和参数会影响垃圾回收的效果。


平时我们接触比较多的oracle hotspot jvm,这里主要分为Young/Tenured/Pren三块区域,也就是常说的新生代、老年代、持久代。一般新的对象会被分配在young的eden区,eden区中存活的对象会被copy到survivor区,survivor又分为form和to,当下次新生代垃圾回收的时候,会吧from里面的清空,copy到另一个survivor的to区域,经过多次回收,还存活的对象会到老年代Tenured,而老年代也会根据一定的条件进行垃圾回收。


Java并发编程


在多核时代下,多线程编程尤为重要,多线程首先要提到线程池,下面举个例子来看看使用线程池和不使用线程池的差别。

long startTime = System.currentTimeMillis();
        final List<Integer> list = new LinkedList<>();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(count));
        Random random = new Random();
        for (int i = 0; i < count; i++) {
            threadPoolExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    list.add(random.nextInt());
                }
            });
        }
        threadPoolExecutor.shutdown();
        try{
            threadPoolExecutor.awaitTermination(1,TimeUnit.DAYS);
        }catch (Exception e){
        }
        System.out.println("耗费时间:" + (System.currentTimeMillis() - startTime));
        System.out.println("长度:" + list.size());
        System.out.println("=================================");
        long startTime1 = System.currentTimeMillis();
        final List<Integer> list1 = new LinkedList<>();
        Random random1 = new Random();
        for (int i = 0; i < count; i++) {
            Thread thread = new Thread(){
                @Override
                public void run(){
                    list1.add(random1.nextInt());
                }
            };
            thread.start();
            try{
                thread.join();
            }catch (Exception e){
            }
        }
        System.out.println("耗费时间:" + (System.currentTimeMillis() - startTime1));
        System.out.println("长度:" + list1.size());

线程池可以复用线程,而不需要冗余的创建线程,而线程池避免了频繁的创建和销毁线程,来统一处理。另外刚刚使用的是ThreadPoolExecutor,此外还有定时线程池ScheduledTheadPoolExecutor。


Synchronized可以用于声明方法,static,也可以声明代码块。当修饰static锁的是对象,所以虽然在同一个对象锁的是不同的方法,但是运行的时候,两个不同的方法是互斥的,但如果static没有修饰方法,只修饰了普通的方法,则不会出现锁对象的情况,只锁了方法。而最后一个锁代码块可以是this,也可以是任意对象,对比较前面的两个更加灵活。


reentrantLock与synchronized作用类似,但是需要自己手动释放锁,所以这时候需要注意,如果发生异常会释放锁失败,所以必须写在finally,另外提供了trylocal方法,当一个线程获取锁,另一个线程在一段时间内没有获取到锁则会返回false。reentrantlock构造器里有一个true和false的参数,默认是非公平的锁,公平锁则需要手动设置。

另外reentrantLock也有一个reentrantReadWriteLock,从名字可以看出是读写锁,主要业务场景使用在读多写少的和读不排斥的场景,这时候用readLock和writeLock来设置锁,效率比前面的全部上锁更高。

相关文章
|
2天前
|
JSON NoSQL Java
Redis入门到通关之Java客户端SpringDataRedis(RedisTemplate)
Redis入门到通关之Java客户端SpringDataRedis(RedisTemplate)
33 0
|
2天前
|
Java
Java编程语言入门指南
Java编程语言入门指南
16 1
|
21小时前
|
算法 Java Python
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
|
2天前
|
SQL Java 关系型数据库
零基础轻松入门Java数据库连接(JDBC)
零基础轻松入门Java数据库连接(JDBC)
12 0
|
2天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
9 0
|
2天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
15 0
|
2天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
13 0
|
2天前
|
Java
Java一分钟之-类与对象:面向对象编程入门
【5月更文挑战第8天】本文为Java面向对象编程的入门指南,介绍了类与对象的基础概念、常见问题及规避策略。文章通过代码示例展示了如何定义类,包括访问修饰符的适当使用、构造器的设计以及方法的封装。同时,讨论了对象创建与使用时可能遇到的内存泄漏、空指针异常和数据不一致等问题,并提供了相应的解决建议。学习OOP需注重理论与实践相结合,不断编写和优化代码。
29 1
|
2天前
|
Java 编译器 对象存储
java一分钟之Java入门:认识JDK与JVM
【5月更文挑战第7天】本文介绍了Java编程的基础——JDK和JVM。JDK是包含编译器、运行时环境、类库等的开发工具包,而JVM是Java平台的核心,负责执行字节码并实现跨平台运行。常见问题包括版本不匹配、环境变量配置错误、内存溢出和线程死锁。解决办法包括选择合适JDK版本、正确配置环境变量、调整JVM内存参数和避免线程死锁。通过代码示例展示了JVM内存管理和基本Java程序结构,帮助初学者更好地理解JDK和JVM在Java编程中的作用。
22 0
|
2天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
【5月更文挑战第2天】JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
42 2