Lesson 13

多线程Multi-Threads

反并发

多线程 与 内存结构

一个进程内的所有线程 会共享 进程的资源(比如 堆)

每个线程 也有自己的资源 (比如 栈)

案例 1 问题

同时执行

但希望有些资源 不要支持 并发

案例 1 改进

Bathroom.java

1 2 3+4 5 6 7 8 9 10 11 12 13 14 15 16 17+18 19
public class Bathroom { public void serve(Person person) { synchronized (this) { String message; message = String.format("%s 进 厕所", person.getName()); System.out.println(message); for (int i = 0; i < 100; i++) { message = String.format("%s 正在使用厕所 %d%%", person.getName(), i + 1); System.out.println(message); } person.release(); message = String.format("%s 出 厕所", person.getName()); System.out.println(message); } }}

相关名词

同步Synchronize单限一个个执行
异步Asynchronize并发一起执行

锁 与 钥匙

打开单限封锁门 (加锁)

synchronized 后面的值是多少,就需要那个地址作为钥匙进入这个门

如果 钥匙就在门上,那么进去并且拿走钥匙

但 钥匙也可能不在门上,那么就需要等待

退出单限封锁区(解锁)

程序走出封锁区后,就需要归还当时的那把钥匙

此时 在门口等待 钥匙的人,由操作系统决定把钥匙给哪个线程。

死锁

死锁问题

相关名词

顺序 sequential处理完一件事,才能处理另外一件事无线程
并发 concurrent能够处理多个任务单核 CPU 交替多线程
并行 parallel能够真正的同时处理多个任务多核 CPU 同时多线程
分布式 distributed多程序单独运行联合解决任务多程序 同时执行 且 协同

数据库Databases

基本认知

什么是

是一个软件

内部就是用文件存储的

对文件的操作 做了很多的优化

是一个服务器程序
requestSQL Query
responseSQL Result (Table)
是一个数据集合

一堆数据在一个库里

关系

一个数据库软件启动后,就是一个服务器程序

一个数据库程序在运行时,可能同时管理多个数据集合

数据库分类

关系型数据库 Relational Database

比较传统以及经典,使用 SQL 进行操作

非关系型数据库 No-SQL Database

一些其它类型的数据库,比如 文档型

数据库品牌

MySQL

PostgreSQL

Oracle

Microsoft SQL Sever

Microsoft Access

MongoDB

ElasticSearch

SQLit

Cassandra

MariaDB

Solr

HBase

Amazon DynamoDB

Redis

安装部署

安装数据库

本机安装

类似下载个 软件,然后双击安装。

开虚拟机安装

安装个虚拟机,然后在虚拟机里下载安装

Docker 安装

使用 Docker 安装

云服务安装

使用 AWS 等云服务安装

什么是

买房 vs 租房

内网服务器

公司自己买一个硬件服务器 放在公司内部的网络里

买房

外网服务器

公司自己买一个硬件服务器 外网可以对接访问这个服务器

买房

云服务商 / 虚拟服务器

公司A 买了一堆服务器 都接到外网上*

租给 公司BCDE... 使用

国外AWS / Azure / GCP
国内阿里云 / 青云 / ucloud

概念与操作

表 Table

用来存储所有同样类型的数据

就是一个巨大的 Excel Sheet

列 Column

一种数据的属性

行 Row

一条数据

SQL

一套数据查询语言标准

每个 DB 的 SQL 大体相同,细节有所差异

指明操作的 DB

1
use zhaozhe;

创建表

1 2 3 4 5
CREATE TABLE coupons ( name VARCHAR(100), code VARCHAR(20), percentage TINYINT);

插入数据

1 2
INSERT INTO coupons(name, code, percentage)VALUES ("Special Event", "1024", 24);

显示所有数据

1 2
SELECT *FROM coupons;

查询某些数据

1 2 3
SELECT *FROM couponsWHERE code = "1024";

Java 代码 操作数据库

Client

需要一个类似 SRRPClient 的东西 去连接 远程数据库服务器

每个数据库都会对不同的语言开发 Client

JDBC

针对这么多不同版本的 Client, Java决定进行专项整顿

定义了一套 针对数据库操作的接口

各大数据库厂商 都根据这个接口去写 实现类

收益

降低 使用者在切换数据库时的 代码修改成本

降低 数据库在 java中的api 的 学习成本

设置 Maven

1 2 3 4 5 6 7 8 9 10 11
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> </dependencies> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>

连接与获取数据

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://zzax-shared.cyd1mmnnvvzs.ap-northeast-2.rds.amazonaws.com:3306/zhaozhe"; String username = "username"; String password = "password"; Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); String query = "SELECT * FROM coupons"; ResultSet resultSet = statement.executeQuery(query); resultSet.next(); String name = resultSet.getString("name"); System.out.println(name);} catch (Exception e) { e.printStackTrace();}

使用环境变量

1 2 3 4*5*6 7 8 9 10 11 12 13 14 15 16 17 18
try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://zzax-shared.cyd1mmnnvvzs.ap-northeast-2.rds.amazonaws.com:3306/zhaozhe"; String username = System.getenv("DB_USERNAME"); String password = System.getenv("DB_PASSWORD"); Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); String query = "SELECT * FROM coupons"; ResultSet resultSet = statement.executeQuery(query); resultSet.next(); String name = resultSet.getString("name"); System.out.println(name);} catch (Exception e) { e.printStackTrace();}

ORM

Object-relational Mapping

对象关系映射

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public class CouponORM { public static Coupon toObject(ResultSet resultSet) { Coupon coupon = new Coupon(); try { coupon.setName(resultSet.getString("name")); } catch (SQLException e) { e.printStackTrace(); } try { coupon.setCode(resultSet.getString("code")); } catch (SQLException e) { e.printStackTrace(); } try { coupon.setPercentage(resultSet.getInt("percentage")); } catch (SQLException e) { e.printStackTrace(); } return coupon; }}

ZZAX 微信公众

文档一更新,立刻告诉你