fyzn12
RSS SITEMAP

Articles

  • Java基础底层

    1 JVM的解析 1.1 JVM的结构图 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register (程序计数器) , VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack ( 本地方法栈 ) ,其中Method Area 和 Heap 是线程共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。 首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件 (以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字 节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢? 概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程, 就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放 掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相 同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域 (实际上对大部分虚拟机来说知发生在Heap上)的原因。 1.
  • 多线程

    java多线程总结 多线程的几种实现方式 继承Thread类 重写run()方法定义线程的行为; 如下图所示 实现Runnable接口 如下图所示 实现 Callable 接口,该接口中的 call方法可以在线程执行结束时产生一个返回值。 使用总结:因为 Java 中的继承是单继承,一个类有一个父类,如果继承了 Thread 类就无法再继承其 他类了,显然使用 Runnable 接口更为灵活。 实现Runnable接口比继承Thread类所具有的优势: 1):适合多个相同的程序代码的线程去处理同一个资源 2):可以避免java中的单继承的限制 3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立 4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类 创建多线程的三种方式:两个接口(Runnable、Callable)一个类(Thread) 实例变量与线程安全 自定义线程类中的实例变量针对其他线程可以有共享与不共享之分。当每个线程都有各自的实例变量时,就是变量不共享。共享数据的情况就是多个线程可以访问同一个变量。 来看下面的示例: 打印的结果中存在多个线程同时对count进行操作,产生了"非线程安全"问题 * 在某些JVM中,i--的操作要分成如下3步: * 取得原有变量的值。计算i-1。对i进行赋值。 * 在这三个步骤中,如果有多个线程同时访问,那么一定会出现非线程安全问题。 解决方法就是使用 synchronized 同步关键字 使各个线程排队执行run()方法。修改后的run()方法: synchronized 关键字的用法 在上面提到"同步"关键字,synchronized关键字可以将方法或者对象标记为同步,以实现对对象和法 的互斥访问,可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将 synchronized 作为方法的修饰符。 如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另 一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数 据库操作中的排他锁就是最好的例子)。当应用程序在对象上调用了一个需要花费很长时间来执行的方 法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效 率。事实上,所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作。 线程的状态变化 要想实现多线程,必须在主线程中创建新的线程对象。任何线程一般具有5种状态,即创建,就绪,运行 阻塞,终止。下面分别介绍一下这几种状态: 创建状态
  • Spring Boot整合Spring Data JPA

    Spring Boot整合Spring Data JPA 1 Spring Boot整合Spring Data JPA环境的搭建和测试 1.1 创建项目配置pom文件 Spring Boot整合Spring Data JPA时需要添加一下依赖包 <dependencies> <!-- 导入springboot的启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 导入mybatis的启动器 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <!-- 导入springboot整合spring Data JPA的启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- mysql数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- mysql的连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> 该项目需要有一个父工程,该工程打包方式以pom形式打包,整合了测试所需要的的依赖包。 1.2 创建application.properties文件 注意:该文件这里主要配置数据库的连接,Jpa的一些属性 配置数据库的连接; 配置正向工程和sql语句的显示。
  • Redis之java客户端

    1 jedis的简单介绍 1.1 Jedis是什么 直观来说,jedis就是redis-cli 1.2 引入jedis的依赖包 <!-- 引入jedis的依赖包 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.3</version> <type>jar</type> <scope>compile</scope> </dependency> 1.3 jedis直连 生成一个Jedis对象,这个对象负责和指定Redis节点进行通信 Jedis jedis = new Jedis(“127.0.0.1”,6379); jedis执行set操作 jedis.set(“hello”,“world”); jedis执行get操作,value=“world” String value = jedis.get(“hello”); Jedis构造函数的简单介绍 Jedis构造方法的参数 Jedis(String host,int port,int connectionTimeout,int soTimeout); host:Redis节点的所在机器的IP; port:Redis节点的端口; connectionTimeout:客户端连接超时; soTimeout:客户端读写超时; 1.4 Jedis直连和连接池的对比 2 redis的具体实现 2.1 慢查询 生命周期 三个命令 两个配置 运维经验 2.
  • 数据库易忘知识点总结

    数据库的基本知识点 1 数据库的基本常用知识点 1.1 在创建数据库时,指定数据库编码命令 create database ads character set 'utf8' 如图所示 1.2 对数据表的操作 删除数据 语法: delete from 表名 [where 条件] 注意: * 如果不加条件,则删除表中所有记录。 * 如果要删除所有记录 delete from 表名—不推荐使用。有多少条记录就会执行多少次删除操作。 * TRUNCATE TABLE 表名;–推荐使用,效率更高,先删除表,然后创建相同的表。 update 表名 set 列名1 = 值1,列名2 = 值2,…[where 条件]; 注意:如果不加条件,则会修改所有的记录; 多表查询取出重复的行 关键字 distinct DQL:查询语句 排序查询 语法:order by 子句 排序方式: ASC:升序;DESC:降序 注意:如果有多个排序条件,则当前的条件值一样时,才会判断第二个条件。 聚合函数: (1)count:计算个数 (2)max (3)min (4)sum