- 博客(339)
- 收藏
- 关注
原创 03 React 面向组件编程
script type = " text/babel " > //1.编写函数式组件 function Demo() {//组件名需要大写,不然 react 会认为标签里面是 html 标签,而不是 react 组件 console . log(this);
2023-10-26 00:27:20
365
2
原创 02 React 入门
实际上,浏览器最终运行的是第二种方式,只是我们是按照第一种方式来写的,所以,JSX 可以理解为是 JS 的语法糖。react 定义的一种类似 XML 的 JS 扩展语法:JS-XML。可以看到,有了 jsx 这样的写法,写出来的虚拟 DOM 更直观,更方便!第一种方式:在写 vdom 的时候,直接将html 的标签写好,然后赋值。当应用的 js 都以模块来编写,这个应用就是一个模块化的应用。当应用时以多组价的方式实现的,这个应用就是一个组件化的应用。作用:复用 js,简化 js,提高 js 运行效率。
2023-03-31 13:59:06
272
原创 01 React 简介
官网:用于构建用户界面的 JavaScript 库React是一个将数据渲染为 HTML 视图的开源 JavaScript 库。
2023-03-30 20:35:31
281
原创 第三章 高级UI组件
安卓的高级组件学习,包括:进度条、拖动条、星级评分条、图像视图、图像切换器、网格视图、下拉列表视图、列表视图、滚动视图和选项卡
2022-11-03 11:08:38
129
原创 第二章 基本UI组件
安卓开发的基本UI组件介绍,包括文本框组件、编辑框组件、普通按钮、图片按钮、单选按钮、复选框、日期选择器、时间选择器和计时器
2022-10-27 14:21:45
3361
原创 第八章 堆
1、堆的核心概述 一个JVM实例只存在一个堆内存,堆也是内存管理的核心区域。 Java堆区在JVM启动的时候被创建,其空间大小也确定好可。堆是JVM管理的最大一块内存空间。(堆内存的大小是可以调节的,启动java程序时使用-Xms -Xmx参数即可) 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上,它应该被视为连续的。 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB) 《Java虚拟.
2021-10-12 11:25:00
135
原创 第七章 本地方法栈
Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的允许被实现称固定的 或者 可动态扩展的内存大小(在内存溢出方面是相同的)。本地方法是使用C语言实现的。它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。当某个线程调用一个本地方法时,它就进入了一个全新的并且不受虚拟机限制的世界。它和虚拟机拥有同样的权限。并不是所有的JVM都支持本地方法。因为Jav
2021-10-08 13:04:15
126
原创 第六章 本地方法接口
什么是本地方法?简单来讲,本地方法就是一个Java程序调用非Java代码的接口。一个Native Method就是这样一个JAva方法,该方法的实现由非Java语言实现。在定义一个native method时,并不提供实现体(像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。getClass方法就是一个本地方法:native关键字可以与其他所有java标识符连用,但是a
2021-10-07 21:59:02
88
原创 第五章 虚拟机栈
虚拟机栈出现的背景由于Java虚拟机跨平台的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。基于栈的设计的优点是:跨平台、指令集小,编译器容易实现。缺点是:性能下降,实现同样的功能需要更多的指令。内存中的栈和堆栈是运行时的单位,堆是存储时的单位也就是说,栈解决程序的运行问题 ,如何执行程序,如何处理数据等;堆解决程序的存储问题,即数据放在哪,怎么放。Java虚拟机栈Java虚拟机栈,早期也叫Java栈。每个线程在创建时都会创建一个虚拟机
2021-10-07 21:24:46
136
原创 第四章 程序计数器(PC寄存器)
作用PC寄存器的作用是存储下一条指令的地址,也就是即将要执行的指令的地址。然后会由执行引擎来执行下一条指令。介绍它是一块很小的内存空间,小到几乎可以忽略不计,也是运行速度最快的存储区域。 在JVM规范中,每个线程都有自己的程序计数器,它是线程私有的。它的生命周期与线程的生命周期是一致的。 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的方法的地址。如果执行的是本地方法,则其值是undefined 它是程序控制流的指示器,分支、循环、跳转、异
2021-10-05 22:05:41
2324
原创 第三章 运行时数据区概述和线程
运行时数据区概述内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对内存布局和管理机制可能存在部分差异。Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程的开始和结束而创建和销毁。在上图中,红色区域为多个线.
2021-10-05 20:51:51
101
原创 第二章 类加载子系统
xi tong类加载器子系统的作用类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。类加载器(ClassLoader)的角色clas..
2021-10-05 15:25:55
76
原创 Java多线程精讲:9、线程管理
9.1 线程组类似于在计算机中使用文件夹管理文件,也可以使用线程组来管理线程,在线程组中定义一组相似(相关)的线程。也可以在线程组中定义子线程组。Thread类有几个构造方法,其中一个允许在创建线程时指定线程组,如果在创建线程时没有指定线程组,则该线程就属于父线程所在的线程组。JVM在创建main线程时会为它指定一个线程组,因此每个Java线程都有一个线程组与之关联,可以调用线程的getThreadGroup()方法返回该线程的线程组。代码演示:package threadgroup;
2021-09-25 13:53:17
382
原创 Java多线程精讲:7、Lock显示锁
在JDK5中新增了Lock锁接口,有ReentrantLock实现类等。ReentrantLock锁称为可重入锁,它的功能要比synchronized多。7.1 锁的可重入性锁的可重入性是指,当一个线程获得一个对象锁后,再次请求该对象锁时,可以再次获得该对象的锁。以下代码可以顺利运行下去,代表synchronized里面的锁是具有可重入性的:package lock.reentrant;public class Test01 { public synchronized voi
2021-09-13 22:56:39
250
原创 Java多线程精讲:6、线程间通信
6.1 等待/通知机制概念:A线程在运行时需要某个地址中的值,但是该地址还没有值,所以A等待。当B线程往该地址处写入了值后,B线程通知A线程,于是A线程继续执行。上面这样的一个过程就是等待/通知机制。实现:Object类中的wait()方法,可以使执行当前代码的线程等待,暂停执行。直到接到通知或被中断为止。注意:wait()方法只能在同步代码块中由锁对象调用,且调用wait()方法后,当前线程会释放锁。Object类的notify()方法可以唤醒处于等待的线程,该方法也必须在同步代码块中由锁
2021-09-07 14:18:35
129
原创 Java多线程精讲:5、线程同步(2)
5.4 CAS CAS(Compare And Swap),是由硬件实现的。 CAS可以将read-modify-write这类的操作转换为原子操作。 i++包括三个操作:读取i的值、i+1、将新的值保存到内存。CAS的原理:在把值写到内存中时,会再次读取该地址的值,如果发现主存中的值与一开始读取到的值不同,则放弃写入(即撤销本次操作);否则就更新进去。使用CAS实现一个线程安全的计数器:package cas;public c...
2021-09-01 17:10:48
91
原创 Java多线程精讲:5、线程同步(1)
5.1 线程同步机制线程同步机制是一套用于协调线程之间的数据访问的机制。该机制可以保障线程安全。Java平台提供的线程同步机制包括:锁、volatile关键字、final关键字、static关键字、以及相应的API(如Object.wait()/Object.notify())等。5.2 锁概述 线程安全问题的产生前提是多个线程并发访问共享数据。所以我们将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问。锁就是复用这种思路来保...
2021-08-31 22:06:51
158
原创 Java多线程精讲:4、Java内存模型
1、每个线程都有独立的栈空间2、每个线程都可以访问堆内存3、计算机的CPU不直接从主存中读取数据,CPU读取数据时,先把主存的数据读到Cache缓存中,然后再把Cache缓存中的数据读到寄存器中。4、JVM中共享的数据可能会被分配到寄存器中,每个CPU都有自己的寄存器,一个CPU不能读取其他CPU的寄存器。如果两个线程分别运行在不同的处理器(CPU)上,而这个共享的数据被分配到寄存器上,会产生可见性问题。5、即使JVM中共享的数据分配到主存中,也不能保证数据的可见性。CPU不直接对主存...
2021-08-29 17:58:38
116
原创 Java多线程精讲:3、线程安全问题
3.1 线程安全问题非线程安全:主要是指多个线程对同一个对象的实例变量进行操作时,会出现值被更改,值不同步的问题。线程安全:原子性、可见性、有序性3.2 原子性原子(Atomic)就是不可分割的意思。原子操作的不可分割有两层含义:1)访问(读、写)某个共享变量的操作从其他线程来看,该操作要么已经执行完毕,要么尚未发生。即其他线程看不到当前操作的中间结果。2)访问同一组共享变量的原子操作,是不能够交叉的。Java有两种方式实现原子性:一种是使用锁,另一种是利用处理器的CAS(Com
2021-08-29 17:22:40
164
原创 Java多线程精讲:2、线程的生命周期
2.1 线程的生命周期线程的生命周期指的是线程对象的生老病死,及线程的状态。线程生命周期可以通过getState()方法获得,线程的状态是Thread.State枚举类型定义的,由以下几种组成:NEW //新建状态。创建了线程对象,在调用start()启动之前的状态RUNNABLE //可运行状态,它包括READY和RUNNING两个状态。READY状态表示线程可以被线程调度器进行调度,来使它变成RUNNING状态。RUNNING状态表示该线程正在被执行。Thread.y...
2021-08-25 23:43:36
120
原创 Java多线程精讲:1、进程和线程介绍
1.1 线程相关概念进程:进程(process)是计算机中的程序关于某数据集合一次运行活动,是操作系统进行资源分配和调度的基本单位。 可以把进程简单理解为操作系统中正在运行的一个程序。线程: 线程(Thread)是进程的一个执行单元。 一个线程是进程中一个单一顺序的控制流,进程的一个执行分支。 进程是线程的容器,一个进程至少有一个线程。 在操作系统中,进程是分配资源的基本单位,如虚拟存储空间...
2021-08-24 23:13:32
720
3
原创 JUC:12、CompletableFuture异步回调
package completable;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;public class CompletableFutureDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { .
2021-08-13 23:28:52
125
原创 JUC:11、Fork/Join分支合并框架
11.1 Fork/Join框架概述Fork/Join 可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join一共完成两件事情:把一个复杂任务进行拆分,大事化小 把拆分结果进行合并...
2021-08-13 23:14:14
226
原创 JUC:10、ThreadPool线程池
10.1 线程池概述线程池(ThreadPool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能保证内核的充分使用,还能防止过分调度。线程池的优势:线程池的工作是控制运行的线程数量。处理过程中将任务放入队列,然后创建线程来进行执行。如果线程数量超多了最大数量,超出数量的线程排队等候。等其他线程执行完毕后,再从队列中取出任务来进行执行。它的主要特点:
2021-08-12 22:00:18
75
原创 JUC:9、阻塞队列 BlockingQueue
8.1 什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。我们不用关心什么时候需要阻塞线程,什么时候需要释放线程,因为这些都会被阻塞队列自动完成。8.2 阻塞队列的分类1、ArrayBloc
2021-08-10 20:34:46
91
原创 JUC:8、读写锁
8.1 概述悲观锁:可以看到,执行-2000的操作时,因为被-5000的线程抢先拿走了锁,所以它不能执行。悲观锁就是每次获取资源时,都会对其进行上锁。虽然不容易出问题,但是效率低。乐观锁:每个线程都可以拿到资源,不过拿时,也会拿到版本编号。当修改后,确认资源的版本好与自己的是否相同,如果不同,则重新拿资源并获取新的版本编号。可以看到,乐观锁支持多线程修改,但是容易出问题。表锁:对整张表进行上锁。行锁:只对表的一行进行上锁,有可能发生死锁。读锁:共享锁,可以多个线程..
2021-08-04 21:48:59
110
原创 JUC:7、强大的辅助类
7.1 减少计数 CountDownLatch概念:CountDownLatch这个类使其他线程各自执行完毕后,这个线程才去执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。代码模拟:6个同学都走了之后,班长锁门假设我们用普通方法模拟:package juc;public class CountDownLatchDemo { //六个同学陆续离开
2021-08-03 22:22:13
91
原创 JUC:7、callable接口
7.1 创建线程的多种方式1、继承 Thread 类,然后重写run方法2、实现 Runnable 接口,然后实现run方法3、Callable接口4、线程池7.2 Callable接口使用继承Thread类、实现Runnable接口的方法创建线程的缺点是,run()方法无法返回结果。为了能够返回结果,我们可以实现Callable接口的call()方法。Runnable()接口和Callable()接口的异同:前者无返回值,后者有返回值前者不会检查抛出异常,后者会检查抛出异常实现方法不
2021-08-03 19:51:58
100
原创 JUC:6、多线程锁
6.1 锁的八种情况1、两个同步方法,一个对象,两个线程,分别调用 getOne()和 getTwo(), 打印? //1 22、在 getOne() 方法中添加睡眠3秒,打印? //1 23、添加非同步方法,启动三个线程,打印? // 3 1 24、创建两个对象,一个调用 getOne() 一个调用getTwo(), 打印? //2 15、将 getOne() 修改为静态同步方法,一个对象,打印? //2 16、将 getTwo() 修改为静态同步方法,一个对象,打印? //1 27、将 g
2021-08-03 16:59:41
141
原创 JUC:5、集合的线程安全
5.1 集合线程的不安全演示创建10个线程对同一个List集合进行修改:/** * List集合线程不安全的例子 */public class ThreadDemo4 { public static void main(String[] args) { //创建ArrayList集合 List<String> list = new ArrayList<>(); //创建线程对list进行修改 for(
2021-08-03 09:51:41
65
原创 JUC:3、线程间通信
3.1 多线程通信概述和案例多线程编程步骤:创建资源类,在资源类创建属性和操作方法在资源类操作方法:判断、干活、通知创建多个线程,调用资源类的操作方法例子:有两个线程,对一个初始化为0的变量,一个对其进行加1操作(在值为0的情况下),一个对其进行减1操作(在值为1的情况下)代码:package communicate;//第一步 创建资源类,定义属性和操作方法class Share { //初始值 private int number = 0;
2021-07-19 20:27:10
101
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人