1.1.1 java基础

1.1.1 Java程序运行原理分析

1、class文件内容
魔数:0xCAFEBABE
版本:JDK版本
访问标志:类的访问修饰符(public)
常量池
当前类
超级类
接口
字段
方法
属性

2、JVM运行时数据区

**方法区**:类信息、常量、静态变量、编译后的代码
**堆内存**:创建的对象、OutOfMemoryError
**虚拟机栈**:多个线程
          一个线程一个私有空间
          一个线程执行多个方法
          一个方法对应多个栈帧
          栈内存默认最大是1M
          为JAVA代码准备的
**本地方法栈**:与虚拟机栈功能类似
            为Native方法准备的
**程序计数器**:当前线程字节码指令执行位置    

栈帧:局部变量表(本地变量表)、操作数栈、动态链接、方法返回地址、附加信息
线程共享(主内存):方法区、堆内存
线程独占(工作区):虚拟机栈、本地方法栈、程序计数器

1.1.2线程状态

线程的6个状态
New:尚未启动的状态(没有调用start方法)
Runnable:CPU正在执行、可运行(等待CPU调动)
Blocked:线程阻塞等待锁(synchronized)
Waiting:等待(没有等待时间,比如wait/join)
Timed Waiting:具有指定等待时间的等待状态(比如sleep)
Terminated:终止线程(正常执行完/异常终止)

在这里插入图片描述

1.1.3线程中止

正确的线程中止方法:interrupt标志位(控制循环的条件)
interrupt正常中止的情况:
线程在调用Object类的wait()、wait(long)、wait(long,int),
Thread类的join()、join(long,int)、sleep(long,int)方法时被阻塞,interrupt会生效,抛出InterruptedException异常
线程是被I/ONIO中的Channel所阻塞,interrupt会生效(抛出对应的I/O或NIO异常)

1.1.4内存屏障和CPU缓存

1、CPU性能优化手段:
缓存(CPU的一级缓存的容量通常在32~4096KB)
CPU读数据时,先在L1(一级缓存)中寻找,再从L2寻找,再从L3寻找,然后是内存,再后是外存储器
CPU对缓存进行改动时,需要发通知给其他CPU
CPU在读写缓存时,要监听其他CPU发出的通知,保证缓存的一致性
运行时指令重排
仅在单CPU自己执行时,能保证结果正确
遵守as-if-serial语义(为提高并行度,不会对存在数据依赖关系的操作做重排序)
2、内存屏障
写内存屏障(强制写入主内存):在指令后插入Store Barrier,让写入缓存中的最新数据更新写入主内存
读内存屏障(强制读取主内存):在指令前插入Load Barrier,让高速缓存中的数据失效,强制重新从主内存加载数据

1.1.5线程通信

1、线程通信的2种机制
wait/notify机制(有顺序要求、等待时会释放锁
wait:当前线程等待,加入该对象的等待集合中,并且放弃当前持有的对象锁
notify/notifyAll:方法唤醒一个或所有正在等待这个对象锁的线程
park/unpark机制(没有顺序要求、等待时不会释放锁)
park:等待(许可/令牌)
unpark:提供(许可/令牌)

在lambda表达式中,this就是调用当前方法的对象,lambda不会创建对象
2、两种机制的优缺点
wait/notify要求在同步关键字里使用(否则会抛出IllegalMonitorStateException(非法监视器状态异常)),免去死锁,但是一定要先调用wait,再调用notify,否则永久等待
park/unpark没有顺序要求,但是park不会释放锁,所以在同步代码中使用要注意
3、伪唤醒
指线程并不是因为notify、notifyAll、unpark等api调用而唤醒,是更底层原因导致的
wait方法正确的判断方式:
synchronized(obj){
while(<条件判断>)
obj.wait();
…//执行后续操作
}
park方法正确的判断方式:
while(<条件判断>)
LockSupport.park();
…//执行后续操作

1.1.6线程封闭

线程封闭:将数据封闭在线程中而避免使用同步的技术叫线程封闭
线程封闭具体体现:ThreadLocal、局部变量
ThreadLocal:每个线程都拥有自己独立的变量(副本)
局部变量(栈封闭):位于执行线程的中,其他线程无法访问这个栈

1.1.7线程池

代码参考Demo9

1、线程:java中是一个对象
操作系统的资源
创建、销毁需要时间
2、线程池:为了方便控制线程数量
3、线程池原理
线程池管理器:用于创建并管理线程池(创建线程池、销毁线程池、添加新任务)
工作线程:线程池中线程(可循环执行任务)
任务接口(Runnable):规定了任务的入口、任务执行完后的收尾工作、任务的执行状态
任务队列:存放没有处理的任务(缓存机制)
4、线程池接口
Executor:最上层的接口,定义了执行任务的方法execute
ExecutorService:继承了Executor,扩展了Callable、Future、关闭方法
ScheduledExecutorService:继承了ExecutorService,增加了定时任务相关的方法
5、线程池实现类
ThreadPoolExecutor:基础、标准的线程池实现
ScheduledThreadPoolExecutor:继承了ThreadPoolExecutor,实现了ScheduledExecutor中相关的定时任务的方法
6、Executors工具类
newFixedThreadPool(int nThreads):核心线程数=最大线程数,无界队列
newCachedThreadPool():核心线程数=0,最大线程数=Integer.MAX_VALUE,无界队列

               **SynchronousQueue**每次执行offer方法先判断有没有空闲线程,如果没有空闲线程offer方法失败,接着创建一个新的线程
         newSingleThreadExecutor():只有一个线程的线程池,无界队列
         newScheduledThreadPool(int corePoolSize):核心线程数由参数指定,最大线程数=Integer.MAX_VALUE,无界队列

7、任务execute过程
线程池达到核心线程数量,就判断工作队列是否已满,如果已满,就判断是否达到最大线程数量,如果没达到,就建新线程执行任务

在这里插入图片描述

调用线程池的shutdown方法:不接收新的任务,等已在线程池的任务全部执行完后,再终止线程池
调用线程池的shutdownNow方法:立刻终止,不接收新的任务,返回等待任务数,线程池中未执行完的任务被终止(抛出interruptedException)
确定合适数量的线程
计算型任务:cpu数量的1~2倍
IO型任务:根据具体的IO阻塞时长进行考量(tomcat默认最大线程数200)

Java语言SUN公司开发的一种编程语言1.1 Java语言产生和发展的背景   Java语言源于Oak语言,这是SUN公司在一项消费性电子产品软件发展方案中采用的语言。Oak的设计目标是用以开发可靠、紧凑、易于移植的分布式嵌入系统。尽管Oak语言在技术上颇为成功,但由于商业上的原因,却未能在市场的激烈竞争中站稳脚跟。然而,Internet和WWW日新月异的发展却为Oak创造了新的生存空间。Oak经过改进,成为一种非常适合网络开发的独特语言——Java,从而脱颖而出,一举成名。   Internet,中译为“因特网”或“互联网”,是当今最大的国际性计算机互联网络。它源于美国国防部高级研究计划局(Advanced Research Project Agency)的网络ARPANET,但发展到今天,已成为一个庞大的全球网。顾名思义,这是一个“网间网”它把各种异构网络联接一起,使位于世界各地、不同网络中的人们能够自由地交换信息。Internet在全球的用户以千万计,并在不断激增;被它直接、间接连通的国家也越来越多。Internet上的协议标准也日益受到广泛支持并在不断地得到扩充。   WWW全称为World Wide Web,中译为“万维网”、“全球网”等,是Internet中最为直观和富有魅力的资源。它运用超文本(Hypertext)技术将信息组织成文字、声音、图像,用户可以用浏览器读取这些信息。WWW上信息种类繁多,用户可以根据自己的需要在任何时间访问自己所需的信息。WWW上的信息由页面组成,页面中包含超文本链接(Hypertext Link),把位于不同页面的相关内容链在一起,因而检索信息非常方便。WWW的发展也是日新月异,它已不止局限于展示静止信息,正在不断增强交互和动态性。许多商家和企业也把目光瞄准了WWW,可以预料,WWW世界将变得越来越丰富多彩。   Internet(含WWW)为人们提供了许多有用的信息,然而,Internet上的用户使用着各种各样的计算机,系统软件和用户软件也缺乏兼容性。在这些不兼容的平台间交换信息,就像对许多语言不通的人讲话一样,是非常困难的。而Java与生俱来的特性刚好可以解决这道电脑界的“世纪难题”。它建立的虚拟环境运行标准解决了软件跨平台执行的问题,使不同的平台都能理解用Java编写的程序,命名Java语言成了网络世界的通用语言。因此,Java在Internet和WWW环境下如鱼得水,迅速风靡全球。   总之,Java作为一种独特的语言,诞生于Internet和WWW蓬勃发展的时期,可谓恰逢其时。如今的Java与当初的Oak语言已不可同日而语。而且,Java技术的创始者SUN公司采用了一种“开放”策略,将它公诸于众,更激发了第三方软件开发商的极大热情,纷纷发展Java技术。Java的前景是非常广阔的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值