【Java多线程】使用同步代码块解决线程安全问题
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141public class ThreadTest implements Runnable { private int trainCount = 100; private Object lock = new Object();//实例化一个对象当作锁 @Override public void run() { wh ...
【Java多线程】函数锁,证明是this锁
函数所非常简单
只需要在函数定义的时候加上synchronized关键字就可以了
那么synchronized用的是什么锁呢
答:this锁,怎么知道他是this锁的呢
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157public class ThreadTest implements Runnable { ...
【Java多线程】死锁
死锁就是:一个宝藏需要两把钥匙来打开,同时间正好来了两个人,他们一人一把钥匙,但是双方都再等对方能交出钥匙来打开宝藏,谁都没交出自己的那把钥匙.就这样这俩人一直僵持下去,直到开发人员发现这个局面.
123456789101112131415161718192021222324252627282930313233343536373839404142public class ThreadTest implements Runnable { private int trainCount = 100; private final Object lock = new Object(); public boolean flag; @Override public void run() { while (true) { if (flag) { synchronized (lock) { sell1(); ...
【Java多线程】内存模型/volatile /Atomic原子类
多线程的三大特性
原子性 独一无二,一致性 保证线程安全问题
可见性 java内存模型图
有序性 join,wait,notify
什么是java内存模型?
答:(属于)多线程可见性jmm
java内存结构是jvm内存分配
Java内存模型,决定了一个线程与另一个线程是否可见
java内存模型 主内存,本地私有内存
1234567891011121314151617181920212223242526272829public class ThreadDemo extends Thread { private boolean flag = true; @Override public void run() { super.run(); System.out.println("Thread starting run"); while (flag) { } System.out.println("Thread Stop"); ...
【Java】NIO学习笔记
缓冲区
Java NIO中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据
根据数据类型不同(Boolean)除外,提供了相应类型的缓冲区;
ByteBufer
CharBuffer
ShortBuffer1
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
上面的缓冲区管理方式几乎一致,通过allocate方法获取缓冲区
缓冲区的核心方法
put();存入数据到缓冲区
get();获取缓冲区中的数据
flip();切换到读取数据模式
rewind();
clear();恢复成最初状态,但里面的数据依然存在
mark();在当前position进行标记
reset();恢复到mark的位置
hasRemaining();查看缓冲区是否还有数据
remaining();缓冲区还剩几个字节没有读取
缓冲区的属性
capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。
limit : 界限,表示缓冲区中可以操作数据的大小。(limit后的数据不能进行读写)
position : 位置,表示缓冲区正在操作数据的位置。
...
【Linux&Java】Linux中安装JDK
使用yum进行安装
123456789#查看所有jdk版本yum -y list java*#找到jdk1.8版本的名称yum install -y jdk版本名#然后进行环境变量的配置,看我之前的文章#测试是否安装成功java -version
手动安装
手动安装的方式比较推荐,可以安装的自己指定的目录
首先去甲骨文官网下载jdk1.8的版本
下载好后解压出来然后再进行环境变量的配置
最后输入javac 检测是否安装成功
【Linux&Maven】Linux中安装Maven
1、下载maven
首先到官网复制下载地址,如果服务器是国内的话请挂v下载后上传到linux服务器中否则无法进行下载,如果是国外的服务器则使用下面的代码进行下载
1curl -O http://us.mirrors.quenda.co/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
2、安装maven,【Linux】Linux中设置环境变量
123456789101112131415161718192021222324#解压包tar -xzvf apache-maven*.tar.gz#切换到目录中cd apache-maven*#把路径添加到环境变量中,看我之前的文章#获取当前的路径pwdvim ~/.bashrc#添加这几行代码MAVEN_HOME=刚刚获取到的路径export PATH=$MAVEN_HOME:$MAVEN_HOME/bin:$PATH#保存后使用source命令进行更新source ~/.bashrc#更新后输入mvn查看是否安装成功#[INFO] Scanning for pr ...
二进制中原码、反码和补码
1、机器的存储编码方式
首先要知道机器是使用补码进行存储数据的
2、什么是原码、反码和补码
什么是原码?首先我们知道int是占4个byte字节的,每个字节占8bit位,所以4*8=32得出int是占了32bit
比如2的二进制是10,而-2的二进制是11111111 11111111 11111111 11111110这里可以看到2的二进制只有两位而-2的二进制呢却有32位这里-2的二进制才是真的原码而10并不是原码其实10前面还有32个0因为都是0所以省略了,所以2的原码是00000000 00000000 00000000 00000010即:-2等于~2=11111111 11111111 11111111 11111110
什么是反码?
从上面2和-2的二进制可以看出来,正数的反码是他本身而负数的反码是在原码的基础上除符号位以外其他取反如:
00000000 00000000 00000000 00000010左边第一个0就是符号位了,当符号位是0时时正数而则1时负数
看符号位知道是正数所以他的反码就是他本身也就是00000000 00000000 00000000 0000 ...
【Java】使用注解器Annotation Processor添加自己的代码规则
概述
注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。你可以为特定的注解,注册你自己的注解处理器。
注解处理器可以生成Java代码,这些生成的Java代码会组成 .java 文件,但不能修改已经存在的Java类(即不能向已有的类中添加方法)。而这些生成的Java文件,会同时与其他普通的手写Java源代码一起被javac编译。
Annotation Processor可以让我们添加自己的错误,在代码编译或者运行的时候如果代码格式不按照我们自己设置的规范的话编译将抛出我们自己设定的错误
案例
对于AbstractProcessor的API文档
我们了解了注解器后现在可以开始编写我们的注解器了,这里我就以修饰符为例子
private final String A = “123”;
public String B = “123”;
上面的编译器会报错
public final String C =“132”;
而当如果变量同时带有public 和final的时候就不会报错
首先新建一个PublicFinal注解,这个注解的作用是判断哪些类需要用到我们自定义的错误,哪些类不用 ...