自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 第七章:拾遗增补

线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中。Thread.State 线程各个状态的验证:Thread.currentThread().getState(); 线程组。线程组的作用是可以批量管理线程或线程组对象,有效地对线程或者线程组对象进行组织。 ThreadGroup group = new ThreadGroup(); Thread threadA...

2018-11-10 21:32:50 149

原创 第六章:单例模式和多线程

单例模式的“饿汉模式” 因为getInstance()方式没有用同步锁,是线程不安全的。 public static MyObject getInstance() { try { // 延迟加载 if(myObject != null) { // 已经有了 }else { //模拟在创建对象之前做一些准备性的工作 Thread.sleep(3000); myObject = new MyObj...

2018-11-10 21:32:13 143

原创 第五章:定时器 Timer

创建一个Timer 就是启动了一个线程,这个线程显然不是守护线程,所以一直运行。停不下来 timer.schedule(task, runDate); 在什么时候,做什么事儿。 在实例化Timer的时候,把它设置为守护线程。 Timer timer = new Timer(true); 计划时间早于当前时间—就立即执行。 一个Timer中可以有多个TimeTask, 也许会出现延时,因为前...

2018-11-10 21:31:33 216

原创 第四章:Lock的使用

前面讲了使用synchronized来实现线程的同步, 这次使用Lock对象来实现。一个类学学API感觉没啥意思 记住一个类ReentranLock类, Lock = new ReentranLock(); lock.lock; …; lock.unlock; 在这之间的 代码就能实现同步,跟synchronized的同步代码块一模一样。 synchronized + wait()/n...

2018-11-10 21:30:44 220

原创 第三章:线程间通信

一句话总结wait和notify: wait使线程停止运行, 而notify使停止的线程继续运行。 wait()执行后,线程进入等待线程队列,释放锁。notify()执行后,并不立即释放锁,后面语句要执行完才释放。 关键字synchronized可以将任何一个Object作为同步对象看待,JAVA为每一个Object都实现了wait()和notify() 方法。 wait()和notify...

2018-11-10 21:30:02 106

原创 第二章:多线程---对象和变量的并发访问

线程不安全问题存在于“实例变量”中, 如果是方法内部的私有变量,则不存在线程不安全的问题。 因为方法内部的变量是私有的,它是随着线程的创建而创建的。 关键字synchronized取得的锁都是对象锁,而不是把一段代码或者是方法当做锁。所以哪个线程先执行带 synchronized关键字的方法,哪个线程就持有该对象的Lock,其他线程只能等待状态。对于非同步的方法,其他 线程仍然可以访问。这...

2018-11-09 00:54:42 119

原创 第一章:多线程---基本API

thread.start() 和 thread.run() 的区别 thread.start()方法通知“线程规划器”。就是让系统安排一个时间来调用thread中的run() 直接用thread.run() 就不是异步的了,而是同步的,是直接由main线程调用的。线程对象不交个“线程规划器”, 必须等run()执行完了,后面的程序才能执行。 //线程共享数据 MyThreadDataSel...

2018-11-09 00:53:39 120

原创 动态代理

2018-10-18 12:05:51 85

原创 自定义最简单Mybatis

要干什么? 什么时候干? 流程 步骤分解 3.1 解析封装 主要是要搞清楚Configuration中Map<String, Mapper> mapper的结构: 在SqlMapConfig.xml的标签里面可以有多个, 一个UserMapper.xml可以有多个 标签。 Map<String, Mapper>: String=key=namespace+id;M...

2018-10-10 23:48:42 189

原创 Web_demo_01(一)

1,一个B2C网站最开始的工作(除了浏览基本信息之外)就是注册和登录 1.1 注册 调用MailUtils给注册用户发一封激活邮件(有激活码. ) —> UserServlet/active方法去数据库查看激活码是否正确----> 跳转到longin.html 。 跟验证码的思路一样,只是一个存在session中,一个存在数据库中。都是服务端生成一个数字,一份保存,一份发客户端,客户...

2018-09-27 21:37:15 536

原创 JVM(五) 常见的垃圾回收器

一、常见的垃圾回收器 1, Serial 单线程,新生代,复制 2, ParNew 多线程(减少了垃圾回收的时间 复制) -XX:MaxGCPauserMillis 设置最大垃圾收集停顿时间 -XX:ParallelGCThreads:设置用于垃圾回收的线程数 GC线程数 3, Parallel Scavenge (复制) 跟2差不多,但关注点不一样。它关注的是吞吐量 吞吐量= 运行用户代码时间...

2018-09-25 17:50:17 183

原创 JVM(四) 垃圾回收的算法

一、哪些对象需要被回收(对象已死?先判断) 1.1 引用计数器(Java垃圾回收器从来没用过) 2.2 可达性分析算法 如果能被 GC Root找到的就是可达的。那哪些能被看成GC Root? a, 虚拟机栈中本地变量表引用的对象 b, 方法区中 类静态变量引用的对象 & 常量引用的对象 c, 本法方法栈中JNI引用的对象 其实 GC Root 不可达的 像比如图中D对象,还是会再挽救一...

2018-09-25 17:15:35 90

原创 JVM(三) 堆内存的划分

一、学习JVM的目的一般是出现内存异常的时候快速定位问题和性能优化,那么内存是如何分配的就必须的作为基础知识。在上一篇《运行时数据区》中描述的了解到其实线程独占的三部分gc基本不动,在线程共享的两部分方法区gc也是基本动不了。那gc基本唯一会经常操作的就是堆内存。堆内存的大致划分: JDK 1.8和以前 JDK 1.8以后 不在用永久带,而是Meta Space已经不在堆内存中。 1.1 新生...

2018-09-25 16:47:31 4028 2

原创 JVM(二) 运行时数据区

一、运行时数据区的大致划分 运行时数据区按照线程共享和独享来划分 1.1 线程共享的(所有线程都共有的):方法区,Java堆 1.2 线程独占区(JVM会给每一个线程划分一块,如图):程序计数器,虚拟机栈,本地方法栈。 1.1 线程共享区 1.1.1 堆:存放对象实例(垃圾回收器管理的最主要的区域) 1.1.2 方法区 ...

2018-09-25 15:17:25 153

原创 JVM (一) 初步认识

JVM (一) 初步认识 一、基础知识 1. Java吹的最精确的牛逼Write Once,Run Anywhere。全靠不同OS上的不同的JVM实现,JVM对应处理的是 .class 文件即jar包。 2. JDK,JRE,JVM结构关系 3.Hello.java程序的流程 二、初次体验 [软件版本idea 3.5 JDK 1.8] 1. 写一个Demo程序,体验dump内存快照和用就co...

2018-09-25 11:52:41 224

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除