读<java编程思想> 第一遍:开启全新认知
第一个知识点:
java中像int和float这种基本数据类型,由于使用的频率很高,所以Java像c/c++一样都是采用了
不通过new的方式来进行创建,而是通过使用自动变量,这个变量存储再栈中,并且可以直接存储值
此时:映射最近学习的volatile 该方法中一个证明 volatile可以实现 线程之间的可见性 的实例
如果该实例使用中使用的是 int类型 是否需要添加 volatile 进行修饰.
具体代码如下:
public class T01_HelloVolatile {
volatile int running = 10; //对比一下有无volatile的情况下,整个程序运行结果的区别
void m() {
System.out.println("m start");
while(running==10) {
}
System.out.println("m end!");
}
public static void main(String[] args) {
T01_HelloVolatile t = new T01_HelloVolatile();
new Thread(t::m, "t1").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.running = 11;
}
}
这块产生问题:就是java中的int是存储再栈中, 我们volatile修饰的会让
首先第一点问题: volatile 中第一点保证内存的可见性, 这个过程是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSKoSU4Z-1597053809311)(C:\Users\zhuzheng\AppData\Roaming\Typora\typora-user-images\image-20200810115434777.png)]
那么问题来了: 我的int类型创建的时候直接存储在我们的栈中,那么为什么会发生这个读取堆内存中缓存不一制问题
第二个知识点:
数据库的三范式:
第一范式:数据库表中的每一列都是具有原子性,就是不可以再拆分,但是这种要视情况而定,
举例子: 地址,这一列看着没什么问题可以直接作为一个列进行使用,但是有些项目要求,
将省和市还有详细地址拆分出来,这样的话那么你的这个地址列就不具有原子性这个特性
第二范式:确保数据库表中每一列都与主键相关
第三范式:确保数据库表中的每一列都与数据库表直接相关而不是间接相关
第三个知识点:
java中的内存:
内存分为五个部分:寄存器:运行速度最快,但是不可自己手动分配使用,
但是在c和c++中是支持推荐寄存器的使用方式,
栈内存:用于存放方法:栈指针向下移动分配内存,栈指针向上移动释放内存,
堆内存:用于存放对象的实体类,与栈内存一样属于RAM内存中,常量池通常通常直接存放到程序代码中,如需严格保护的话吗,
可以存放到ROM(Read Only memory) 还有就是非RAM存储区,数据完全存在于程序之外,最明显的两个例子:
一个是序列化对象被转换成字节流被发往另一台机器,第二个是持久化对象
y memory) 还有就是非RAM存储区,数据完全存在于程序之外,最明显的两个例子:
一个是序列化对象被转换成字节流被发往另一台机器,第二个是持久化对象
目前看到这里:发现上面的一些问题,后期还会继续添加