- 博客(6)
- 收藏
- 关注
原创 关于spring(?)的问题
Test的原因吗?还是Tomcat的原因? @Test public void test(){ System.out.println(Thread.currentThread().getName()); new Thread(() -> { { try { System.out.println(Thread.currentThread().getName());
2022-01-19 18:39:38
883
原创 Java内存模型中的重排序
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。数据依赖性定义:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为三种类型:写后读、写后写和读后写。这三种类型,只要重排序两个操作间的执行顺序,程序的执行结果就会被改变。编译器和处理器在做重排序时,会遵守数据依赖性,也就是说编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作
2021-11-19 18:54:25
344
原创 Java内存模型基础
并发编程模型的两个关键问题在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。线程如何通信通信是指线程之间以何种机制来交换信息。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态来隐式通信。 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。线程如何同步同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某种方法或某段代码需要在线程之间互斥进行。
2021-11-12 19:41:45
151
原创 原子操作的实现原理
原子操作意为不可被中断的一个或一系列操作。我们来看看处理器和Java如何实现原子操作的。处理器中实现原子操作处理器提供总线锁定和缓存锁定两种机制来实现原子操作。使用总线锁保证原子性多个处理器对共享变量进行读改写操作时,这样读改写操作就不是原子的。总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。使用缓存锁保证原子性总线锁定把CPU和内存之间的通信锁住了,其他处理器不能处理其他内存地址的数据,所以
2021-11-05 19:27:53
347
原创 synchronized的实现原理
synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下三种形式:对于普通同步方法,锁是当前实例对象 对于静态同步方法,锁是当前类的Class对象 对于同步代码块,锁是Synchronized括号里配置的对象 在JVM中,synchronized方法同步和代码块同步是基于进入和退出Monitor对象来实现的。其中代码块的同步是使用monitorenter和monitorexit指令实现的,而方法同步的实现在JVM规范中没有详细说明。monito...
2021-11-01 19:40:51
84
原创 volatile的实现原理
想要理解Java并发机制的底层实现原理,是跳不过volatile这个关键字的,所以我们要先理解volatile是什么,是如何实现的。volatile是轻量级的synchronized,它在多处理开发中保证了共享变量的”可见性“,可见性是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。一、volatile的定义Java语言规范第三版对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java
2021-10-21 19:51:19
205
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人