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
基本认知
什么是
是一个软件
内部就是用文件存储的
对文件的操作 做了很多的优化
是一个服务器程序
request | SQL Query |
response | SQL 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; }}