Maven环境变量配置
创建文件
1
2
3cd ~
touch .bash_profile
open -e .bash_profile写入bash_profile
1
2
3
4
5M2_HOME=/Users/work/apache-maven-3.5.0/
PATH=$M2_HOME/bin:$PATH
export M2_HOME
export PATH
一个人,一根烧火棍,面对整个世界.
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
1 | brew install http://git.io/sshpass.rb |
拉取
1 | wget http://download.redis.io/releases/redis-3.2.6.tar.gz |
解压
1 | tar -zxvf redis-3.2.6.tar.gz |
1 | wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.6.tgz ./ |
1 | wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm' |
启动Java应用程序则是一个进程,一个进程可以启动多个线程,线程是操作系统调度最小单元。线程拥有独立的计数器、栈和局部变量,可以共享堆内存。
一个Java程序入口是main主线程,线程优先级从1-10,优先级越高分配时间片越长。
更多的处理器核心
使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变得更有效率。
更快的响应时间
使用多线程技术,即将数据一致性不强的操作派发给其他线程处
理(也可以使用消息队列),如生成订单快照、发送邮件等。这样做的好处是响应用户请求的线程能够尽可能快地处理完成,缩短了响应时间,提升了用户体验。
更好的编程模型
Java为多线程编程提供了良好、考究并且一致的编程模型,使开发人员能够更加专注于问题的解决,即为所遇到的问题建立合适的模型,而不是绞尽脑汁地考虑如何将其多线程化。一
旦开发人员建立好了模型,稍做修改总是能够方便地映射到Java提供的多线程编程模型上。
类延迟初始化常采用单例模式。
方法1:1
2
3
4
5
6
7
8
9
10public class Singleton {
private static Singleton singleton = null;
public static Singleton getInstance() {
if (singleton == null) {//1
singleton=new Singleton();//2
}
return singleton;
}
}
多线程中,步骤1可以同步执行,导致步骤2多次执行。
通信是指线程间的信息交换,主要有两种:共享内存和消息传递。
共享内存是线程利用内存的公共状态进行隐私通信。
在Java中主要利用堆内存变量实现共享内存,包括静态域、数据、实例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class ThreadShare {
//利用内存静态变量进行状态传递
static int num = 0;
private void increase() {
num++;
System.out.println(num);
}
public static void main(String[] args) {
ThreadShare threadShare = new ThreadShare();
new Thread(threadShare::increase).start();
new Thread(threadShare::increase).start();
}
}
处理器保障从系统内存中读取和写入字节是原子的,即其他处理器不能访问该字节地址。
处理器发出Lock#信号到总线上,其他处理器阻塞,该处理器独享内存。
总线锁把CPU和内存通信锁住,其他CPU无法访问其他内存地址,开销较大。
可以在缓存中,锁定内存地址,保障原子性。
缓存锁定缓存行时,回写内存不声明LOCK#,而是修改内部内存地址,同时通过缓存一致性阻止其他处理器修改;当其他处理器回写
,将会无效缓存行,从内存重新加载数据。