mysql日常命令
登录命令,然后输入密码
mysql -uroot -p
创建数据
CREATE DATRABSE [数据库名字]
选择数据库
use [数据库名]
导入sql文件,登录了后在use 选了数据库在可以执行
source [所在的路径//*.sql]
mysql -uroot -p
CREATE DATRABSE [数据库名字]
use [数据库名]
source [所在的路径//*.sql]
Single Threaded Execution 有时也会被称之为 临界区。表示 临界区 内的代码同一时间内只允许一个线程执行,这个模式是并发编程的基础,对应 Java 中也就是同步代码块 synchronized,或其他显式锁 lock。
多线程环境
多个线程同时访问的共享资源
这些线程会改变共享资源。
示例
现有票 100 张,分三个窗口售卖,卖完为止。
票类:
public class Ticket {
private int counter = 100;
public void sell() {
if (counter > 0) {
System.out.println(Thread.currentThread().getName() + "号窗口卖出:" + this.counter-- + "号票");
} else {
System.out.println("票已卖完");
}
}
}
窗口类:
public class StationThread extends Thread {
private final Ticket ticket;
public StationThread(String name, Ticket ticket) {
super(name);
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket.sell();
}
}
}
测试类:
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new StationThread("S1", ticket).start();
new StationThread("S2", ticket).start();
new StationThread("S3", ticket).start();
}
}
很明显的可以看到,同一张票,被多个窗口同时售卖了,就是因为未对共享资源 Ticket 做保护,导致了这种情况。
解决办法也很简单,给 Ticket 的 sell 方法加上 synchronized 即可。这样就防止了多个窗口同时访问同一张票。
public class Ticket {
private int counter = 100;
public synchronized void sell() {
if (counter > 0) {
System.out.println(Thread.currentThread().getName() + "号窗口卖出:" + this.counter-- + "号票");
} else {
System.out.println("票已卖完");
}
}
}
类图
时序图
总结
单线程的情况,不需要使用此模式,就好像一个人在家上厕所,不需要锁门一样。
只有当 多线程 同时对 同一个共享资源,在线程中 进行了修改,才需要使用此模式。
且需要注意,对于 共享资源,如果用到了此模式,要保证所有使用他的地方都进行了保护。不然等于你把门锁住了,但窗子没关。
集群实例
创建3个springboot项目
引入eureka server 依赖
配置文件application.properties
tips:node为一个微小的springboot项目
node1: server.port=8761
http://localhost:8762/eureka,http://localhost:8763/eureka
node2: server.port=8762
http://localhost:8761/eureka,http://localhost:8763/eureka
node3: server.port=8763
http://localhost:8761/eureka,http://localhost:8762/eureka
@EnableEurekaServer 注解
<!-- 引入Eureka Client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
#指定服务端口
server.port=8989
#指定 服务名称
spring.application.name=EUREKACLIENT
#eureka server 服务注册中心地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#用来修改eureka server 默认接受心跳最大时间 默认是90s
eureka.instance.lease-expiration-duration-in-seconds=10
#指定客户端多久向eureka server 发送一次心跳 默认是30s
eureka.instance.lease-renewal-interval-in-seconds=5
Application main方法上面加上这个注解
@EnableEurekaClient //让当前微服务作为一个eurekaserver客户端进行服务注册
<!-- 引入Eureka Server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
#eureka 默认端口 8761
server.port=8761
#指定服务名称 ps:服务不能出现下划线 默认服务名称不区分大小写,推荐服务大写
spring.application.name=EUREKASERVER
#eureka server 服务注册中心地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#关闭eureka client 立即注册
eureka.client.fetch-registry=false
# 让当前应用仅仅是服务服务注册中心
eureka.client.register-with-eureka=false
#eureka关闭自我保护机制
#关闭自我保护
eureka.server.enable-self-preservation=false
#超时3s自动清除
eureka.server.eviction-interval-timer-in-ms=3000
在application spring类上面加上注解@EnableEurekaServer //开启当前应用是一个服务注册中心