http
Http什么是Http?HTTP(HyperText Transfer Protocol) 超文本传输协议.
HTTP/0.9 单行协议1989年 当时还在欧洲核子研究组织工作的蒂姆伯纳斯李(Tim Berners-Lee)提出了一种能让远隔两地的研究者们共享知识的设想,最开始称为Mesh,后来在1990年实施期间将其命名为 World Wide Web(万维网) 它基于现有的TCP/IP协议构建,包括四个部分:
一种表示超文本文档的文本格式,即超文本标记语言(HTML);
一种用于交换这些文档的简单协议,即HyperText传输协议(HTTP);
一个客户端可以显示这些文档,第一个Web浏览器称为World Wide Web
一个可以访问文档的服务器
这四部分在1990年底完成,虽然这时候Web页面只能显示单纯的文本内容,但是已经基本满足了建立Web站点的初衷,实现了信息资源共享
以下就是HTTP/0.9的请求内容:
1GET /page.html
用唯一可用的GET方法向目标服务器获取指定的文档(一旦连接到服务器,协议,服务器,端口号这些都不是必须的)
响应也机器简单 只包 ...
MySQL基础
MySQL基础数据库概述什么是数据库数据库是持久化的一种介质,可以理解成用来存储和管理数据的仓库
持久化: 把数据保存到可掉电式存储设备中以供之后使用. 持久化的大多数时候是将内存中的数据存储在数据库中,当然也可以存储在磁盘文件,XML数据文件中
为什么使用数据库
可将数据持久化到硬盘
可存储大量数据
方便检索
保证数据的一致性,完整性
安全,可共享
通过组合分析,可以产生新数据
常见数据库场景
Oracle: 甲骨文
DB2: IBM
SQL Server: 微软
MySQL: 甲骨文
数据库相关概念
DB:
数据库(Database): 存储数据的”仓库”.它保存了一系列有组织的数据
DBMS
数据库管理系统(Database Management System).数据库是通过DBMS创建和操作的容器
SQL
结构化查询语言(Structure Query Language): 专门用来与数据库通信的语言
数据库存储数据的特点
将数据放到表中,表再放到库中
一个数据库中可以有多个表,每一个表都有一个名字,用来标识自己
表名具有唯一性
表具有一些特性,这些特性定义了 ...
Java内存模型
Java内存模型并发编程模型的两个关键问题
线程之间如何通信(以何种机制来交换信息)
在命令式编程中,线程之间的通信机制有两种,共享内存和消息传递
Java并发采用的是共享内存模型 Java线程之间的通信总是隐式进行…
线程之间如何同步
同步是指程序中用于控制不同线程间操作发生相对顺序的机制.
在共享内存并发模型里,同步是显式进行的.程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行.
在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的
Java内存模型的抽象结构在Java中,所有实例域,静态域和数组元素都存储在堆内存中,堆内存在线程之间共享.
局部变量和异常处理器参数不会在线程之间共享,因此他们不会有内存可见性问题,也不会受内存模型的影响.
这跟JVM堆栈的知识匹配上了
Java线程之间的通信由Java内存模型控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见
线程之间的共享变量储存在主内存中
每一个线程都有一个私有的本地内存
本地内存存储了该线程以读/写共享变量的副本**.本地内存是JMM的一个抽象概念,并不真实存在**. ...
Java中的锁
Java中的锁Lock接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(有些锁可以允许多个线程并发地访问共享资源,比如读写锁)
Java SE5之后,并发包中新增了Lock接口(以及其实现类)来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用的时候需要显示地获取锁和释放锁
虽然缺少了synchronized隐式获取锁的便捷性,但是却拥有了锁获取与释放的可操作性,可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步
123456Lock lock = new ReentranLock();lock.lock();try{}finally{ lock.unlock();}
不需要将获取锁的过程写在try中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时.也会导致锁无故释放.
Lock接口提供的synchronized关键字所不具备的主要特性
尝试非阻塞地获取锁
当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取 ...
原子操作的实现原理
原子操作的实现原理原子(atomic)本意是”不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或者一系列操作”
术语定义缓存行(Cache line);缓存的最小操作单位
比较并交换(Compare and swap)CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较旧值有没有变化,如果没有发生变化,才交换成新值,发生了变化则不交换
CPU流水线(CPU pipeline)CPU流水线的工作方式就像工业生产上的装配流水线,在CPU中由56个不同功能的电路单元组成一条指令处理流水线,然后将一条x86指令分成56步再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度
内存顺序冲突(Memory order violation)内存顺序冲突一般是由假共享引起的,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线
处理器如何实现原子操作使用总线锁保证原子性所谓总线锁就是使用处理器提供的一个LO ...
RabbitMQ工作模式
RabbitMQ工作模式官网对应模式介绍:https://www.rabbitmq.com/getstarted.html
1. Work queues工作队列模式1.1 模式说明
Work Queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。
应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
1.2 代码Work Queues与入门程序的简单模式的代码是几乎一样的;可以完全复制,并复制多一个消费者进行多个消费者同时消费消息的测试。
生产者12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667package com.itheima.producer;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rab ...
什么是CAS?
什么是CAS?CompareAndSwapInt
CAS乐观锁:多个线程使用CAS同时更新同一个变量时,只有一个线程更新变量的值其他线程被告知失败,可以再次尝试
CAS有可能带来ABA问题(1->8->1)如果在乎:
AtomicStampedReference
每次改变都需要版本号
AtomicMarkableReference
不在乎改了多少次,只在乎改没改
如果在写回去的时候被打断了,怎么办?
写回去的时候必须保障原子性(硬件底层保证原子性)
并发编程3大特性 可见性 原子性 有序性
ElasticSearch安装和基础
ElasticSearch开源的ElasticSearch是目前全文搜索引擎的首选,可以快速的存储,搜索和分析海量数据
近乎实时存储检索 可以处理pb级别的数据 es使用java开发 和lucene作为核心
目的通过简单的Restful API来隐藏 Lucene的复杂性 从而让全文搜索变简单
去年的虚拟机上的es居然还可以正常启动
Docker安装
下载镜像文件
12docker pull elasticsearch:7.4.2docker pull kibana:7.4.2
创建实例
1234567891011121314151617181920212223242526272829303132333435# 给虚拟机创建自己的目录 为了后面把配置挂载出来mkdir -p /mydata/elasticsearch/configmkdir -p /mydata/elasticsearch/data# 表示es可以用远程的任何机器访问echo "http.host:0.0.0.0">>/mydata/elasticsearch/config/ela ...
多线程
多线程线程可以有如下6种状态:
New (新建)
Runnable (可运行)
Blocked (阻塞)
Waiting (等待)
Timed waiting (计时等待)
Terminated (终止)
要获得一个线程的状态,只需要调用getState方法
新建线程当使用new操作符创建一个新线程时,如new Thread(r),这个线程还没有开始运行.
这意味着它的状态是新建(new).
可运行线程一旦调用start方法,线程就处于可运行状态(Runnable)
一个可运行的线程可能正在运行也可能没有运行
阻塞和等待线程当线程处于阻塞或者等待状态时,它暂时是不运动的.它不运行任何代码,而且消耗最少的资源. 要由线程调度器重新激活这个线程
当一个线程视图获取一个内部的对象锁.而这个锁目前被其他线程占用,该线程就会被阻塞. 当所有的线程都释放了这个锁,并且线程调度器允许该线程持有这个锁时,他将变成非阻塞状态.
当线程等待另一个线程通知调度器出现一个条件时,这个线程会进入等待状态. 调用Object.wait方法或者Thread.join方法,或者等待Java.util.concur ...
线程池
线程池基本概念什么是线程池?线程池其实就是一种多线程处理的方式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务.这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过了的实现了Runnable或Callable接口的实例对象;
为什么使用线程池?使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对线程进行统一的管理和控制,从而提高系统的运行效率,降低系统运行压力.
使用线程池有什么优势?
线程和任务分离,提高线程重用性
控制线程并发数量,降低服务器压力,统一管理所有线程
提升系统响应速度,假如创建线程用的时间是T1,执行任务的时间是T2,摧毁线程的时间T3, 那么使用线程池就免去T1和T3的时间;
工作原理ThreadPoolExecutor
1234567public ThreadPoolExecutor(int corePoolSize, //核心线程数量 int maximumPoolSize, //最大线程数 long ...