![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 60
OOC_ZC
OOC
展开
-
JNI 的使用
JNI即Java Native Interface,可以实现Java与其他语言的通信。这里连接C++,思路为Java中函数声明为native,然后编译出 .h 文件,cpp文件实现 .h 中声明的函数。把cpp编译成 .o 然后编译成 .so,最后在Java中指定 .so 的位置。首先在Java中声明native函数。目录树为接下来编译生成头文件...原创 2016-02-28 22:06:13 · 449 阅读 · 0 评论 -
Java 类加载机制
类是在运行期间第一次使用时动态加载的,而不是编译时期一次性加载。因为如果在编译时期一次性加载,那么会占用很多的内存。原创 2019-01-02 16:37:52 · 130 阅读 · 0 评论 -
Java 语言中的线程安全
线程安全:多个线程不管以何种方式访问某个类,并且在主调代码中不需要进行同步,都能表现正确的行为。线程安全有以下几种实现方式:不可变不可变(Immutable)的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要一个不可变的对象被正确地构建出来,永远也不会看到它在多个线程之中处于不一致的状态。多线程环境下,应当尽量使对象成为不可变,来满足线程安全。不可变的类型:final 关...原创 2019-01-11 10:14:51 · 241 阅读 · 0 评论 -
Java 虚拟机中内存的分配
1. 运行时数据区域1.1 程序计数器 (Program Counter Register)程序计数器(PC)是一块较小的内存空间,记录正在执行的字节码指令的地址(如果正在执行的是Native方法则为空)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。每个线程都需要一个独立的程序计数器,在线程私有的内存中存储。1.2 Java...原创 2018-12-26 13:17:26 · 201 阅读 · 0 评论 -
JVM 内存分配与回收策略
Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。Full GC:发生在老年代上,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。1. 内存分配策略1.1 对象优先在 Eden 分配大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Mino...原创 2018-12-30 19:56:21 · 159 阅读 · 0 评论 -
Java 垃圾收集算法
1. 垃圾收集(Garbage Collection)垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这里的内存分配和回收都具备确定性。而堆中对象的创建和回收都是动态的,垃圾收集器所关注的是这部分内存。...原创 2018-12-29 14:47:47 · 242 阅读 · 0 评论 -
Java 类加载器&双亲委派模型
两个类相等需要类本身相等,并且使用同一个类加载器进行加载。这是因为每一个类加载器都拥有一个独立的类名称空间。这里的相等,包括类的 Class 对象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回结果为 true,也包括使用 instanceof 关键字做对象所属关系判定结果为 true。...原创 2019-01-03 17:12:47 · 162 阅读 · 0 评论 -
Java ConcurrentHashMap 类解析
基于JDK 7 的 ConcurrentHashMap 源码1. 存储结构static final class HashEntry<K,V> { final int hash; final K key; volatile V value; volatile HashEntry<K,V> next;}ConcurrentHashMap...原创 2018-12-24 14:21:17 · 218 阅读 · 0 评论 -
Java 中 ++ 操作符的线程安全性及 AtomicInteger 类
Java中 ++i 的操作是线程安全的么?如果是方法里定义的局部变量,一定是线程安全的,因为每个方法栈是线程私有的。如果是类的成员变量,++i则不是线程安全的,因为++i相当于 i = i + 1,可以通过synchronize块来提供同步,也可使用AtomicInteger原子操作类,这里同步体比较小(++i),推荐使用自旋CAS实现的AtomicInteger。volatile不能解决...原创 2018-12-22 21:19:36 · 929 阅读 · 0 评论 -
JDK 1.6 synchronized 锁优化
在进行并发操作时为保证线程安全会使用各种锁,此文初步介绍各种锁的概念。1. 悲观锁 (操作前先获取锁)总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作...原创 2019-01-11 13:48:09 · 591 阅读 · 0 评论 -
Java 中 volatile 关键字解析
volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个下线程能读到这个修改的值。即Java线程内内存模型确保所有线程看到这个变量的值是一致的。为什么会不一致?因为在多处理器中每个处理器有各自的L1,L2等高速缓存。为了提高运行速度,刚用过的变量值会暂时存储在L1/L2高速缓存而不是立刻写回内存中(...原创 2019-01-07 14:56:33 · 227 阅读 · 0 评论 -
JDK 1.8 ThreadLocal 源码解析
可以使用 java.lang.ThreadLocal 类来实现线程本地存储功能。原创 2019-03-31 22:42:47 · 464 阅读 · 0 评论 -
Java 内存模型&先行发生原则
Java 内存模型Java 内存模型(JMM Java Memory Model ),试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。处理器上寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致...原创 2019-01-08 13:03:50 · 267 阅读 · 0 评论 -
notify() 和 signal() 唤醒线程是随机的吗?
一、概述synchronized 是非公平锁。ReentrantLock 默认是非公平锁,但可设置为公平锁。那线程通过Object.nofity() 和 Condition.signal() 被唤醒时是否是公平的呢?先说结果,在Java 1.8 HotSpot下,两者都是公平的。查看Java文档:void signal()Wakes up one waiting thread.If...原创 2019-07-09 20:28:24 · 4615 阅读 · 16 评论 -
Java 反射
Class 对象如果想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用。Class.forName()就是实现此功能的捷径,因为这样就不需要为了获得Class引用而持有该类型的对象。但如果已经拥有一个感兴趣的类型的对象,那就可以使用getClass()方法来获取Class引用。这个方法属于Object类的一部分,它将返回该对象实际类型的Class引用。拥有Class对象可以使用...原创 2019-07-03 23:45:04 · 1621 阅读 · 0 评论 -
Java N个线程轮流打印数字
这里实现两个线程轮流打印1-100数字,即线程一打印1,3,5,…,线程二打印2,4,6,…。class PrintThread implements Runnable { private byte[] flag; int number; public PrintThread(int number, byte[] flag) { this.number = number; ...原创 2019-07-11 11:12:37 · 1479 阅读 · 0 评论 -
Java 注解
概述注解的优点包括:更加干净易读的代码,以及编译期类型检查。注解的语法比较简单,除了@符号的使用之外,它基本与Java固有的语法一致。Java内置了三种注解,定义在java.lang中的注解:@Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。@Deprecated,如果程序员使用了注解为它的元素,那么编...原创 2019-06-18 11:46:16 · 216 阅读 · 0 评论 -
Java 线程池
3.1 Executor 接口java.util.concurrent 包中的执行器(Executor) 接口可以管理 Thread 对象,从而简化并发编程。Executor 允许你管理异步任务的执行,而无需显式地管理线程的生命周期。ExecutorService 接口继承自Executor(具有服务生命周期的Executor,例如关闭) 知道如何构建恰当的上下文来执行Runnable对象。...原创 2019-04-28 00:45:19 · 256 阅读 · 0 评论 -
设计模式基础
.原创 2019-01-15 19:44:54 · 355 阅读 · 0 评论 -
Java 线程在虚拟机中的实现
每个已经执行了 start() 且还未结束的 java.lang.Thread 类的实例就代表了一个线程。Thread 类的所有关键方法都是声明为Native的,在Java API中,一个Native方法往往意味着这个方法没有使用或者无法使用平台无关的手段来实现(也可能为了执行效率)。1. 线程的实现实现线程主要有3种方法:内核线程、用户线程、用户线程加轻量级进程混合实现。1.1 使用内核线...原创 2019-01-09 19:41:26 · 751 阅读 · 0 评论 -
Java 线程基础
.原创 2018-12-01 21:17:23 · 211 阅读 · 0 评论 -
Java 内部类和静态内部类的加载时机
内部类和静态内部类都是延时加载的,也就是说只有在明确用到内部类时才加载。只使用外部类时不加载。非静态内部类不能拥有 静态变量 静态语句 静态方法静态内部类无需外部类实例即可调用非静态内部类需要外部类实例调用示例:public class OuterClass{ static{ System.out.println("OuterClass static loa...原创 2018-11-28 15:24:50 · 3603 阅读 · 1 评论 -
Java 懒汉模式之Volatile优化
很多懒汉模式写成如下模式:public class LazySingle { private static LazySingle single; private LazySingle(){} public static LazySingle getInstance(){ if(single == null){ synchronized (La原创 2017-11-08 13:21:31 · 839 阅读 · 0 评论 -
Java 参数传递
基本数据类型传值,对形参的修改不会影响实参; 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象; Integer, Double等包装类及String类是immutable类型,可以理解为传值,最后的操作不会修改实参对象。 可以看到都是final类型。原创 2017-11-07 01:22:41 · 203 阅读 · 0 评论 -
Java 实现生产者消费者问题
最近复习Java,重写了生产者消费者问题。 采用synchronized锁以及wait notify方法实现。package Thread;import java.util.LinkedList;class Producer implements Runnable{ ProducerConsumer p; String name; Producer(ProducerCons原创 2017-11-07 00:39:28 · 214 阅读 · 0 评论 -
Linux下编译Java错误: 找不到或无法加载主类
比如目录结构为: 这里main函数在mygui/Test.java中,正确编译方法为,在src目录javac mygui/Test.javajava mygui.Test这样就可以正确执行。如果在mygui目录下编译,则需要添加src目录为classpath目录。javac -cp ../ Test.javajava -cp ../ mygui.Test其中 -cp 是指定类路径。原创 2017-11-06 19:23:29 · 10083 阅读 · 1 评论 -
JDBC 连接MySQL的使用。
1.什么是JDBC JDBC 为Java Data Base Connectivity. 即Java数据库链接。为实现Java访问数据库的统一接口。2.JDBC连接mysql连接具体的数据库需要相关的驱动,这里到点击打开链接 下载。解压后把jar导入到JDBC的项目中。如果导入成功,则import com.mysql.jdbc.Connectio原创 2015-12-10 20:26:45 · 433 阅读 · 0 评论 -
Java流 学习笔记
java.io 包里定义了多个流类型。所有流类型都继承自以下四种抽象流类型。UTF-16 一个字符两个字节。节点流与处理流的区别常见节点流分别是文件,内存中的数组,一个String,线程和线程通信的PipeInputStream 常用类InputStream 基本方法int read( ); // 读原创 2015-12-01 12:01:22 · 546 阅读 · 0 评论 -
Iterator 与 Iterable 的区别
Iterable接口中封装了Iterator接口,实现Iterable就可以使用foreach结构了。Iterator中和核心的方法next(),hasnext(),remove(),都是依赖当前位置,如果这些集合实现Iterator,则必须包括当前迭代位置的指针。当集合在方法间进行传递的时候,由于当前位置不可知,所以next()之后的值,也不可知。而当实现Iterable则不然,每次原创 2015-12-17 16:33:30 · 417 阅读 · 0 评论 -
Java 五种单例模式
单例模式有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例。单例模式实现有两种方式:1. 饿汉模式public class HungrySingle { //这里方法均为static,其他类可直接使用。 private static final Hung原创 2019-01-15 13:12:58 · 454 阅读 · 0 评论 -
通过apt-get 安装java,JAVA_HOME 的路径
通过apt-get安装java的,JAVA_HOME的路径在这里!!“/usr/lib/jvm/java-6-sun-1.6.0.15”原创 2015-11-08 00:07:24 · 1336 阅读 · 0 评论 -
Java 同步机制
.原创 2018-12-04 18:25:56 · 669 阅读 · 0 评论 -
Java Vector & CopyOnWriteArrayList 解析
.原创 2019-03-19 16:07:02 · 340 阅读 · 0 评论 -
Java ArrayList & LinkedList 解析
ArrayList 类似于动态数组,与Vector的区别主要是Vector是线程安全的。1. 类定义:实现了 RandomAccess 接口,因此支持随机访问。public class ArrayList&amp;amp;amp;lt;E&amp;amp;amp;gt; extends AbstractList&amp;amp;amp;lt;E&amp;amp;amp;gt; implements List&原创 2018-11-17 16:55:51 · 163 阅读 · 0 评论 -
Java Object 类常用方法
1. equals() : 判断两个对象是否等价。Object类的默认实现(直接检查是否为同一个对象的引用):Object类equals()的默认实现并不能很好的体现equals()想要的功能。因为不指向同一个对象,两对象也可能等价(关键域相同)。看String类equals()的实现:这是一个标准的equals()的实现,大体思路是:检查是否为同一个对象的引用,如果是直接返回 ...原创 2018-11-15 11:41:41 · 292 阅读 · 0 评论 -
Java 集合类(容器类)概览
Collection 接口,继承自 Iterable接口,表示存储着对象的集合。Collection 实现了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。结构 (I表示...原创 2019-03-18 23:20:19 · 226 阅读 · 0 评论 -
JDK 1.8 HashMap 源码解析
HashMap 类定义:public class HashMap&amp;amp;lt;K,V&amp;amp;gt; extends AbstractMap&amp;amp;lt;K,V&amp;amp;gt; implements Map&amp;amp;lt;K,V&amp;amp;gt;, Cloneable, Serializable {其中哈希表(Hash table)table 的定义原创 2018-11-20 18:07:50 · 198 阅读 · 0 评论 -
Java 基础学习笔记
基本类型自动转换float f = 1.1 // 编译错误 “possible lossy conversion from double to float”1.1默认是double类型,这里为向下转型(double -&amp;amp;amp;gt; float),Java 不能隐式执行向下转型,但可以隐式执行向上转型。float f = 1 // 编译通过1默认为int类型,向上转型可以隐式执行。float ...原创 2019-03-19 00:59:15 · 913 阅读 · 1 评论 -
Java 自动装箱和拆箱
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。能进行装箱与拆箱的基本类型和对应的包装类型。 图片来自 http://blog.csdn.net/hp910315/article/details/48654777自动装箱与拆箱示例代码:public class Autoboxing { public static void原创 2018-11-07 16:29:54 · 224 阅读 · 0 评论 -
Java String类拼接时的编译器优化
先看代码:public class Main { public static void main(String[] args) throws Exception{ String baseStr = "baseStr"; final String baseFinalStr = "baseStr"; String str1 = "baseSt...原创 2018-11-13 01:10:48 · 2095 阅读 · 1 评论