代码缩进调整
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
title: Lamdba表达式(1)
|
||||
date: 2018-5-9 20:45:52
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
`Lamdba表达式`是Java8的一项重要的新特性
|
||||
@@ -22,31 +22,31 @@ Collections.sort(names, (o1,o2)->o1.compareTo(o2));
|
||||
等价于以下代码
|
||||
```java
|
||||
Collections.sort(names, new Comparator<String>() {
|
||||
@Override
|
||||
public int compare(String o1, String o2) {
|
||||
return o1.compareTo(o2);
|
||||
}
|
||||
@Override
|
||||
public int compare(String o1, String o2) {
|
||||
return o1.compareTo(o2);
|
||||
}
|
||||
});
|
||||
```
|
||||
也许下面的代码能更好地体现Lamdba表达式就是匿名类的另外一种写法
|
||||
```java
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
Demo d = ()->{return "aa";};
|
||||
d.func();
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
Demo d = ()->{return "aa";};
|
||||
d.func();
|
||||
}
|
||||
}
|
||||
|
||||
interface Demo {
|
||||
public String func();
|
||||
public String func();
|
||||
}
|
||||
```
|
||||
---
|
||||
#### Lamdba表达式语法
|
||||
```java
|
||||
(Type1 param1, Type2 params,...,TypeN paramN) -> {
|
||||
//若干语句...
|
||||
return 表达式;
|
||||
//若干语句...
|
||||
return 表达式;
|
||||
}
|
||||
```
|
||||
这是一般语法 , 也就是最完整的一种语法
|
||||
@@ -56,15 +56,15 @@ interface Demo {
|
||||
1. 编译器可以根据上下文推断参数的类型 , 大多数情况下参数类型可以省略
|
||||
```java
|
||||
(param1, params,...,paramN) -> {
|
||||
//若干语句...
|
||||
return 表达式;
|
||||
//若干语句...
|
||||
return 表达式;
|
||||
}
|
||||
```
|
||||
2. 当参数只有一个 , 可以省略小括号
|
||||
```java
|
||||
param -> {
|
||||
//若干语句...
|
||||
return 表达式;
|
||||
//若干语句...
|
||||
return 表达式;
|
||||
}
|
||||
```
|
||||
3. 当方法中只包含一条语句 , 可以省略大括号 return 和 最后的分号
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: Lamdba表达式(2)-Stream
|
||||
date: 2018-5-9 20:46:13
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
有了Lamdba表达式 , Java就具有了进行函数式编程的条件
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: Maven(1)-初见
|
||||
date: 2018-5-9 20:18:14
|
||||
tags:
|
||||
- maven
|
||||
- maven
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
我们在工作中可能会在IDE当中有很多项目
|
||||
@@ -59,29 +59,29 @@ categories:
|
||||
这里尝试引入几个jar包
|
||||
```xml
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>maven_demo</groupId>
|
||||
<artifactId>hello_maven</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>maven_demo</groupId>
|
||||
<artifactId>hello_maven</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>3.8.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mongo</groupId>
|
||||
<artifactId>mongo-java-driver</artifactId>
|
||||
<version>3.2.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mongo</groupId>
|
||||
<artifactId>morphia</artifactId>
|
||||
<version>1.2.3</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>3.8.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mongo</groupId>
|
||||
<artifactId>mongo-java-driver</artifactId>
|
||||
<version>3.2.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mongo</groupId>
|
||||
<artifactId>morphia</artifactId>
|
||||
<version>1.2.3</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
```
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: Maven(2)-搭建web项目
|
||||
date: 2018-5-9 20:25:23
|
||||
tags:
|
||||
- maven
|
||||
- maven
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
在Maven当中创建一个web项目的步骤如下
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: Maven(3)-从入门到重新入门
|
||||
date: 2018-5-9 20:29:31
|
||||
tags:
|
||||
- maven
|
||||
- maven
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
`Maven`是基于项目对象模型 ( POM ) , 可以通过描述信息来管理项目的构建 报告 和文档的软件项目管理工具
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: Maven(4)-补充
|
||||
date: 2018-5-9 20:29:31
|
||||
tags:
|
||||
- maven
|
||||
- maven
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
maven默认使用的JDK版本是1.5 , 我们可以在配置文件中`<profiles>`标签里加入如下内容 , 将默认JDK改为1.8
|
||||
@@ -35,15 +35,15 @@ maven默认使用的JDK版本是1.5 , 我们可以在配置文件中`<profiles>`
|
||||
那么我们可以将C排除
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>B-group</groupId>
|
||||
<artifactId>B</artifactId>
|
||||
<version>1.0</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>C-group</groupId>
|
||||
<artifactId>C</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
<groupId>B-group</groupId>
|
||||
<artifactId>B</artifactId>
|
||||
<version>1.0</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>C-group</groupId>
|
||||
<artifactId>C</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
```
|
||||
这样就可以把对C的依赖排除
|
||||
@@ -66,7 +66,7 @@ maven在处理这种冲突的时候 , 有以下的原则
|
||||
比如
|
||||
```xml
|
||||
<properties>
|
||||
<spring-version>4.3.11.RELEASE</spring-version>
|
||||
<spring-version>4.3.11.RELEASE</spring-version>
|
||||
</properties>
|
||||
...
|
||||
<dependencies>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: Maven(5)-jetty-plugin
|
||||
date: 2018-5-9 20:32:31
|
||||
tags:
|
||||
- maven
|
||||
- maven
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
与tomcat类似 , jetty也是一个servlet容器 , 为例如jsp和servlet提供运行环境
|
||||
@@ -21,17 +21,17 @@ categories:
|
||||
<build>
|
||||
...
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-maven-plugin</artifactId>
|
||||
<version>9.4.7.RC0</version>
|
||||
<configuration>
|
||||
<jettyXml>jetty.xml</jettyXml>
|
||||
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
|
||||
<scanIntervalSeconds>3</scanIntervalSeconds>
|
||||
<contextPath>/</contextPath>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-maven-plugin</artifactId>
|
||||
<version>9.4.7.RC0</version>
|
||||
<configuration>
|
||||
<jettyXml>jetty.xml</jettyXml>
|
||||
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
|
||||
<scanIntervalSeconds>3</scanIntervalSeconds>
|
||||
<contextPath>/</contextPath>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
...
|
||||
</build>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: Maven(6)-可运行jar打包
|
||||
date: 2018-5-9 20:42:27
|
||||
tags:
|
||||
- maven
|
||||
- maven
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
要让jar包是可运行的
|
||||
@@ -20,24 +20,24 @@ pom.xml
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.1.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<transformers>
|
||||
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||
<mainClass>com.main.Main</mainClass>
|
||||
</transformer>
|
||||
</transformers>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.1.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<transformers>
|
||||
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||
<mainClass>com.main.Main</mainClass>
|
||||
</transformer>
|
||||
</transformers>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
...
|
||||
<plugins>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
title: 自增的线程安全问题
|
||||
date: 2018-5-9 20:48:56
|
||||
tags:
|
||||
- 线程
|
||||
- 线程
|
||||
categories:
|
||||
- Java
|
||||
- Java
|
||||
---
|
||||
|
||||
Java中的 `i++` 操作也是有可能存在线程安全问题的
|
||||
@@ -18,42 +18,42 @@ Java中的 `i++` 操作也是有可能存在线程安全问题的
|
||||
private static int num = 0;
|
||||
|
||||
private static void cnt() {
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
num ++;
|
||||
}
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
num ++;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
List<Thread> thList = new ArrayList<Thread>();
|
||||
|
||||
for(int i=0 ; i<10 ; i++) {
|
||||
Thread thread = new Thread(){
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
//由于自增操作的运算速度要远快于创建和启动线程
|
||||
//执行一个等待去保证所有的子线程都构造完成以后再执行自增操作
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
cnt();
|
||||
}
|
||||
};
|
||||
thread.start();
|
||||
thList.add(thread);
|
||||
}
|
||||
while(true) {
|
||||
boolean flag = true;
|
||||
//判断是否所有子线程都已结束
|
||||
for(Thread thread : thList) {
|
||||
flag = flag && !thread.isAlive();
|
||||
}
|
||||
if(flag) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
System.out.println(num);
|
||||
List<Thread> thList = new ArrayList<Thread>();
|
||||
|
||||
for(int i=0 ; i<10 ; i++) {
|
||||
Thread thread = new Thread(){
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
//由于自增操作的运算速度要远快于创建和启动线程
|
||||
//执行一个等待去保证所有的子线程都构造完成以后再执行自增操作
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
cnt();
|
||||
}
|
||||
};
|
||||
thread.start();
|
||||
thList.add(thread);
|
||||
}
|
||||
while(true) {
|
||||
boolean flag = true;
|
||||
//判断是否所有子线程都已结束
|
||||
for(Thread thread : thList) {
|
||||
flag = flag && !thread.isAlive();
|
||||
}
|
||||
if(flag) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
System.out.println(num);
|
||||
}
|
||||
```
|
||||
以上程序的执行结果多数情况都不是1000 , 虽然num++确实被执行了1000次
|
||||
@@ -88,7 +88,7 @@ inited = true;//语句2
|
||||
|
||||
//线程B
|
||||
while(!inited) {
|
||||
sleep();
|
||||
sleep();
|
||||
}
|
||||
doSomething(context);
|
||||
```
|
||||
@@ -137,11 +137,11 @@ private static int num = 0;
|
||||
private static Object obj = new Object();
|
||||
|
||||
private static void cnt() {
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
synchronized (obj) {
|
||||
num ++;
|
||||
}
|
||||
}
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
synchronized (obj) {
|
||||
num ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
+ 使用ReentrantLock
|
||||
@@ -150,11 +150,11 @@ private static int num = 0;
|
||||
private static ReentrantLock objLock = new ReentrantLock();
|
||||
|
||||
private static void cnt() {
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
objLock.lock();
|
||||
num ++;
|
||||
objLock.unlock();
|
||||
}
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
objLock.lock();
|
||||
num ++;
|
||||
objLock.unlock();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -165,11 +165,11 @@ private static void cnt() {
|
||||
调用这个类中的可用方法进行自增操作 , 可以保证线程安全
|
||||
```java
|
||||
private static AtomicInteger num = new AtomicInteger(0);
|
||||
|
||||
|
||||
private static void cnt() {
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
num.getAndIncrement();//以原子方式获取并且自增1
|
||||
}
|
||||
for(int i=0 ; i<100 ; i++) {
|
||||
num.getAndIncrement();//以原子方式获取并且自增1
|
||||
}
|
||||
}
|
||||
```
|
||||
>传统的锁机制需要陷入内核态,造成上下文切换,但是一般持有锁的时间很短,频繁的陷入内核开销太大,所以随着机器硬件支持CAS后,JAVA推出基于compare and set机制的AtomicInteger,实际上就是一个CPU循环忙等待。因为持有锁时间一般较短,所以大部分情况CAS比锁性能更优。
|
||||
|
||||
Reference in New Issue
Block a user