Synchronized的实现原理和应用
Synchronized的实现原理和应用很多人称呼它为重量级锁.但是随着Java SE1.6对Synchronized进行优化后,有些情况下就没有那么重了.
Java的每一对象都可以作为锁具体的实现方式:
对于普通的同步方法,锁是当前的实例对象
对于静态同步方法,锁是当前类的Class对象
对于同步方法块,锁是Synchronized括号里配置的对象
Java对象头Synchronized的用的锁是存在Java对象头里面的.如果对象是数组类型,则虚拟机用三个字宽(Word)存储对象头.
如果是非数组,则是2字宽存储对象头
在32位虚拟机中,1字宽等于4字节,即32bit,如下图
Java 对象头的长度
长度
内容
说明
32/64bit
Mark Word
存储对象的hashCode或锁信息
32/64bit
Class Metadata Address
存储到对象类型数据的指针
32/32bit
Array length
数组的长度(如果当前对象是数组)
Java对象头里的Mark Word里默认存储对象的Hash Code,分代年龄和锁标记位
Java对 ...
Java并发编程的艺术
Java并发编程的艺术(读书笔记)第一章 并发编程的挑战(0312)
即使是单核处理器也支持多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制,CPU不断地切换线程执行
上下文切换: 任务从上一个保存到再次加载这个任务的过程就是一次上下文切换
并发不一定比串行快,因为线程有创建和上下文切换的开销
Lmbench3可以测量上下文切换的时长
vmstat可以测量上下文切换的次数
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class ConcurrentTest { //实测只有上亿次 并发才会比串行快 private static final Long count=100000000L; public static void main(String[] args) throws InterruptedException { concurrency(); seri ...
JAVA NIO
JAVA NIO简介JavaNIO (New IO /Non Blocking IO),可以代替标准的Java IO
Java NIO 与 IO的主要区别
通道和缓冲区Java NIO系统的核心在于:通道(channel)和缓冲区(Buffer) 通道表示打开到IO设备(文件,套接字)的连接
若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区. 然后操作缓冲区,对数据进行处理
简而言之 channel负责传输 Buffer 负责存储
Buffer除了Boolean 以外,都有对应的类型缓冲区
所有缓冲区的管理方式几乎一致,通过allocate() 获取对应的缓冲区
缓冲区存储数据的两个核心方法put(): 存入数据到缓冲区中
get(): 获取缓冲区中的数据
缓冲区的四个核心属性capacity: 容量,表示缓冲区中最大存储数据的容量,一旦声明 不能改变
position: 表示缓冲区中正在操作数据的位置
limit: 界限,表示缓冲区中可以操作数据的大小 limit后边的数据不能读写
mark: 标记,表示当前position的位置 可以通过reset() ...
VUE基础
VUE基础渐进式JavaScript框架
VUE特点:
遵循MVVM模式
编码简洁,体积小,运行效率高,适合移动/PC端开发
本身只关注UI,可以轻松引入vue插件或者其它第三方库开发项目
与其他前端JS框架的关联
借鉴angular的模板和数据绑定技术
借鉴react的组件化和虚拟Dom技术
VUE拓展插件
vue-cli: 脚手架
vue-resource(axios): ajax请求
vue-router: 路由
vuex状态管理
vue-lazyload: 图片懒加载
vue-scroller: 页面滑动相关
mint-ui:基于vue的UI组件库(移动)
element-ui:基于vue的UI组件库(PC端)
VUE的基本使用1234567891011121314151617181920212223242526272829303132333435363738<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> & ...
Linux nc指令
Linux nc指令netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。
netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。
下面是一些使用netcat的例子.
[A(172.31.100.7) B(172.31.100.23)]
端口扫描端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。
$nc -z -v -n 172.31.100.7 21-25可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点)
v 参数指使用冗余选项(译者注:即详细输出)
n 参数告诉netcat 不要使用DNS反向查询IP地址的域名
这个命令会打印21到25 所有开放的端口。Banner是一个文 ...
网络I/O工作机制
网络I/O工作机制数据从一台主机发送到网络中的另一台主机需要经过很多步骤.首先需要有相互沟通的意向.其次要有能够沟通的物理渠道(物理链路);是通过电话,还是直接面对面交流.再次,双方见面时语言要能够交流,而且双方说话的步调要一致,明白什么时候该自己说话,什么时候该对方说话(通信协议).
TCP状态转化(三次握手四次挥手)(后面更新)
影响网络传输的因素
网络带宽
传输距离
TCP拥塞控制:
JavaSocket的工作机制什么是Socket?
Socket这个概念没有对应到一个具体的实体,它描述计算机之间完成相互通信的一种抽象功能.
主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立链接,而建立Socket连接必须由底层TCP/IP来建立TCP连接.建立TCP连接需要底层IP来寻址网络中的主机
但是在一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过TCP或者UPD的地址也就是端口号来指定.这样就可以通过一个Socket实例来唯一代表一个主机上的应用程序的通信链路了
建立通信链路当客户端与服务端通信的时候,客户端首先要创建一个Socket实例,操作 ...
CURL命令详解
$ curl命令详解
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。
1语法:$ curl [option] [url]
常见参数12345678910111213141516-A/--user-agent <string> 设置用户代理发送给服务器-b/--cookie <name=string/file> cookie字符串或文件读取位置-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中-C/--continue-at <offset> 断点续转-D/--dump-header <file> 把header信息写入到该文件中-e/--referer 来源网址-f/-- ...
Spring(四)-AOP
Spring(四)-AOP
什么是AOP?
(1)面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率
(2)不修改源代码方式,在主干功能里添加新功能
AOP底层使用动态代理
(1)有两种的动态代理
有接口的情况,使用JDK动态代理
没有接口的情况,使用CGLIB动态代理
AOP(JDK动态代理)使用JDK动态代理,使用Proxy类里面的方法创建代理对象
调用newProxyInstance方法
方法里面有三个参数:
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口InnovationHandler,创建代理对象,写增强的方法
编写JDK动态代理代码
(1)创建接口,定义方法
1234public interface UserDao { public int add(int a,int b); public String update(String id);}
(2)创建接口实现类
1234567 ...
运行时数据区及线程
运行时数据区概述以及线程运行时数据区内部结构
内存是非常重要的系统资源 是硬盘和cpu的中间仓库和桥梁, JVM内存布局 规定了java在运行过程中内存申请 分配 管理的策略,保证了JVM的高效稳定运行. 不同的JVM对于内存划分和管理机制存在部分差异 结合JVM虚拟机规范,探讨经典的JVM内存布局
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁.另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁.
每个线程: 独立包括程序计数器 栈 本地栈
线程间共享: 堆 堆外内存(永久代或元空间, 代码缓存)
线程
线程是一个应用程序里的运行单元 JVM允许一个应用有多个线程并行执行
在HotSpot里 每个线程都与操作系统的本地线程直接映射
当一个java线程准备好执行以后 此时一个操作系统的本地线程也同时创建
java线程执行终止后 本地线程也会回收
操作系统负责所有线程的安排调度到任何一个可用的CPU上 一旦本地线程初始化成功 他就会调用java线程中的run() ...
反编译案例集
反编译11234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586public class Test1 { public static void main(String[] args) { int i=2; int j=3; int k=i+j; }}//javap -vLast modified 2021年3月6日; size 476 bytes SHA-256 checksum 8e654caa67ddc0bcfb09a7b96a365eab397bb819078361cb1b83261628e1c49f Compiled from "Test1.java"public class com.atguig ...