Skip to content

Commit a7455f5

Browse files
committed
updates book
1 parent 18f460c commit a7455f5

15 files changed

Lines changed: 137 additions & 104 deletions

File tree

SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
* [Java程序死锁问题原理及解决方案](第5章 多线程/Java程序死锁问题原理及解决方案.md)
2626
* [线程锁技术](第5章 多线程/线程锁技术.md)
2727
* [定时器、互斥、同步通信技术](第5章 多线程/定时器、互斥、同步通信技术.md)
28-
* [线程范围内共享数据](第5章 多线程/线程范围内共享数据.md)
28+
* [线程范围内共享数据](第5章 多线程/线程范围内共享数据.md)
2929
* [多个线程之间共享数据的方式探讨](第5章 多线程/多个线程之间共享数据的方式探讨.md)
3030
* [使用JDK5中同步技术的3个面试题](第5章 多线程/使用JDK5中同步技术的3个面试题.md)
3131
* [同步工具类](第5章 多线程/同步工具类.md)

book.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"description": "Java基础入门教程",
3+
"title" : "Java基础入门",
4+
"language": "zh-hans",
5+
"author" : "AllenIverson",
6+
"gitbook": "3.2.2"
7+
}

第3章 面向对象/面向对象.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,25 @@
2626

2727
**举例:**
2828

29-
**(1) 买电脑:**
30-
31-
面向过程:我的了解电脑--了解我自己的需求--找对应的参数信息--去中关村买电脑--讨价还价--买回电脑
29+
**(1) 买电脑:**
30+
31+
面向过程:我的了解电脑--了解我自己的需求--找对应的参数信息--去中关村买电脑--讨价还价--买回电脑
3232

3333
面向对象:我知道我要买电脑 -- 班长去给我买 -- 班长就买回来了
3434

35-
**(2) 洗衣服:**
35+
**(2) 洗衣服:**
3636

3737
面向过程:把衣服脱下--找一个盆--放点洗衣粉--加点水--把衣服扔进去--搓一搓--清洗衣服--拧干--晾起来
3838

3939
面向对象:把衣服脱下--打开全自动洗衣机--扔进去--一键即可--晾起来
4040

41-
**(3) 吃饭:**
41+
**(3) 吃饭:**
4242

4343
面向过程:去超市买菜--摘菜--洗菜--切菜--炒菜--盛起来--吃
4444

4545
面向对象:上饭店吃饭,你--服务员(点菜)--厨师(做菜)--服务员(端菜)--吃
46-
## **1.4 面向对象开发,设计,特征**
46+
47+
## **1.4 面向对象开发、设计、特征**
4748

4849
面向对象开发:就是不断的创建对象,使用对象,指挥对象做事情。
4950
面向对象设计:其实就是在管理和维护对象之间的关系。
@@ -53,9 +54,11 @@
5354
- 封装(encapsulation)
5455
- 继承(inheritance)
5556
- 多态(polymorphism)
57+
5658
# **2. 类与对象及其使用**
5759

5860
## **2.1 类与对象的关系**
61+
5962
我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。
6063

6164
我们如何表示一个现实世界事物呢:
@@ -235,7 +238,6 @@ class ArgsTest {
235238
}
236239
}
237240
```
238-
239241
运行结果:
240242

241243
![形参](http://img.blog.csdn.net/20150813212944156)
@@ -304,24 +306,24 @@ class NoNameDemo {
304306

305307
封装概述:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
306308

307-
**封装的好处**
309+
**封装的好处**
308310

309311
- 隐藏实现细节,提供公共的访问方式
310312
- 提高了代码的复用性
311313
- 提高安全性。
312314

313-
**封装原则**
315+
**封装原则**
314316

315317
- 将不需要对外提供的内容都隐藏起来。
316318
- 把属性隐藏,提供公共方法对其访问。
317319

318-
**private关键字**
320+
**private关键字**
319321

320322
- 是一个权限修饰符。
321323
- 可以修饰成员(成员变量和成员方法)
322324
- 被private修饰的成员只在本类中才能访问。
323325

324-
**private最常见的应用**
326+
**private最常见的应用**
325327

326328
- 把成员变量用private修饰
327329
- 提供对应的getXxx()/setXxx()方法
@@ -472,7 +474,7 @@ this关键字的内存图解:
472474
- 如果你提供了构造方法,系统将不再提供
473475
- 构造方法也是可以重载的
474476

475-
**给成员变量赋值有两种方式**
477+
**给成员变量赋值有两种方式**
476478
- setXxx()
477479
- 构造方法
478480

第4章 常见对象/字符串格式化.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ String类的format()方法用于创建格式化的字符串以及连接多个字
1212
format()方法有两种重载形式
1313

1414
- format(String format, Object... args)
15+
1516
新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。
1617

1718
- format(Locale locale, String format, Object... args)

第4章 常见对象/正则表达式.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
##**相关阅读**
1+
# **相关阅读**
2+
23
1. [Java基础:String类](http://blog.csdn.net/axi295309066/article/details/52765748)
34
2. [Java字符串格式化](http://blog.csdn.net/axi295309066/article/details/52820512)
45
3. [Java基础:正则表达式](http://blog.csdn.net/axi295309066/article/details/52822073)
56

67
# **1. 正则表达式概述**
8+
79
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本
810

911
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen
@@ -13,7 +15,9 @@
1315
## 1.1 给定一个正则表达式和另一个字符串,我们可以达到如下的目的
1416
- 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)
1517
- 可以通过正则表达式,从字符串中获取我们想要的特定部分
18+
1619
## 1.2 正则表达式的特点是
20+
1721
- 灵活性、逻辑性和功能性非常的强;
1822
- 可以迅速地用极简单的方式达到字符串的复杂控制。
1923
- 对于刚接触的人来说,比较晦涩难懂。

第5章 多线程/同步工具类.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ public class CyclicBarrierTest {
112112

113113
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。
114114

115-
可以实现一个人(也可以是多个人)等待其他所有人都来通知他,也可以实现一个人通知多个人的效果,类似裁判一声口令,运动员开始奔跑(一对多),或者所有运送员都跑到终点后裁判才可以公布结果(多对一)。
115+
可以实现一个人(也可以是多个人)等待其他所有人都来通知他,也可以实现一个人通知多个人的效果,类似裁判一声口令,运动员开始奔跑(一对多),或者所有运送员都跑到终点后裁判才可以公布结果(多对一)。
116116

117-
用指定的计数 初始化 CountDownLatch。在调用 countDown() 方法之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
117+
用指定的计数 初始化 CountDownLatch。在调用 countDown() 方法之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
118118

119119
实现运动员比赛的效果
120120

@@ -268,7 +268,8 @@ ArrayBlockingQueue中只有put和take方法才具有阻塞功能。方法类型
268268

269269
当指定队列大小,如果已经放满,其他存入数据的线程就阻塞,等着该队列中有空位,才能放进去。当取的比较快,队列中没有数据,取数据的线程阻塞,等队列中放入了数据,才可以取。
270270

271-
ArrayBlockingQueue中只有put和take方法才具有阻塞功能。方法类型如下
271+
ArrayBlockingQueue中只有put和take方法才具有阻塞功能。方法类型如下
272+
272273
| 功能 | 抛出异常 | 特殊值 | 阻塞 | 超时 |
273274
| :--- | :-------- | :------- | :----- | :------------------- |
274275
| 插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
@@ -328,7 +329,7 @@ public class BlockingQueueTest {
328329
A队列向空间中存数据,B从空间里取数据,A存入后,通知B去取,B取过之后,通知A去放,依次循环
329330

330331
**示例**:子线程先循环10次,接着主线程循环100次,接着又回到子线程,循环10次,再回到主线程又循环100,如此循环50次。
331-
332+
332333
**说明**:这里通过使 用两个具有1个空间的队列来实现同步通知的功能(实现了锁和condition的功能),以便实现队列间的通信,其中使用到了构造代码块为主队列先存入一个数据,以使其先阻塞,子队列先执行。
333334

334335
使用构造代码块的原因:

第5章 多线程/多线程.md

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -744,10 +744,8 @@ Timer:一种工具,线程用其安排以后在后台线程中执行的任务
744744

745745
## **9.2 实现Runnable好处**
746746

747-
1. 将线程的任务从线程的子类中分离出来,进行了单独的封装,实现数据和程序分离,按照面向对象的思想将任务封装成对象。
748-
749-
750-
2. 避免了Java单继承的局限性。所以,创建线程的第二种方式较为常用。
747+
- 将线程的任务从线程的子类中分离出来,进行了单独的封装,实现数据和程序分离,按照面向对象的思想将任务封装成对象
748+
- 避免了Java单继承的局限性。所以,创建线程的第二种方式较为常用
751749

752750
## **9.3 线程间的通信**
753751
- 多个线程在处理同一资源,但是任务却不同,这时候就需要线程间通信。
@@ -765,19 +763,19 @@ Timer:一种工具,线程用其安排以后在后台线程中执行的任务
765763
- sleep必需捕获异常,wait,notify,notifyAll不需要捕获异常
766764

767765
## **9.5 常用方法**
768-
|方法声明|功能描述|
769-
|:---|:---|
770-
|String getName()|获取线程的名称|
771-
|void setName(String name)|设置线程的名称|
772-
|static Thread currentThread()|获取当前正在执行的线程|
773-
|int getPriority()|获取线程优先级|
774-
|void setPriority(int newPriority)|设置线程优先级(1-10)|
775-
|static void sleep(long millis)|线程休眠|
776-
|void join()|线程加入,该线程执行完毕其他线程才可以执行|
777-
|static void yield()|线程礼让|
778-
|setDaemon(boolean on)|后台线程/守护线程|
779-
|void stop( )|已过时,不建议使用|
780-
|interrupt( )|中断线程|
766+
| 方法声明 | 功能描述 |
767+
| :-------------------------------- | :-------------------- |
768+
| String getName() | 获取线程的名称 |
769+
| void setName(String name) | 设置线程的名称 |
770+
| static Thread currentThread() | 获取当前正在执行的线程 |
771+
| int getPriority() | 获取线程优先级 |
772+
| void setPriority(int newPriority) | 设置线程优先级(1-10) |
773+
| static void sleep(long millis) | 线程休眠 |
774+
| void join() | 线程加入,该线程执行完毕其他线程才可以执行 |
775+
| static void yield() | 线程礼让 |
776+
| setDaemon(boolean on) | 后台线程/守护线程 |
777+
| void stop( ) | 已过时,不建议使用 |
778+
| interrupt( ) | 中断线程 |
781779

782780
## **9.6 线程的生命周期**
783781
新建,就绪,运行,阻塞(同步阻塞,等待阻塞,其他阻塞),死亡

第5章 多线程/线程池.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
Java5中的线程并发库都在java.util.concurrent包及子包中
44

55
# **1. Executor类的继承结构**
6+
67
![ThreadPoolExecutor](http://img.blog.csdn.net/20161024205013699)
78

89
Executor是线程池的顶级接口,只有一个执行任务的方法execute()
910

1011
ExecutorService是Executor的子接口,该接口中包含了线程池常用的一些方法
12+
1113
| 方法 | 功能描述 |
12-
| :-------------- | :------------------------------------ |
14+
| :------------- | :----------------------------------- |
1315
| execute() | 执行任务 |
1416
| shutdown() | 调用后不再接收新任务,如果里面有任务,就执行完 |
1517
| shutdownNow() | 调用后不再接受新任务,如果有等待任务,移出队列;有正在执行的,尝试停止之 |
@@ -96,13 +98,14 @@ public ThreadPoolExecutor(
9698

9799
# **5. 线程池工具类Executors**
98100
jdk1.5之后的一个新类,提供了一些静态工厂,生成一些常用的线程池,ThreadPoolExecutor是Executors类的底层实现
99-
| 方法 | 功能描述 |
100-
| :------------------------ | :-------------------------------------- |
101-
| newCachedThreadPool() | 创建一个可缓存的线程池 |
102-
| newFixedThreadPool() | 创建一个固定大小的线程池 |
103-
| newScheduledThreadPool() | 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求 |
101+
102+
| 方法 | 功能描述 |
103+
| :---- | :---- |
104+
| newCachedThreadPool() | 创建一个可缓存的线程池 |
105+
| newFixedThreadPool() | 创建一个固定大小的线程池|
106+
| newScheduledThreadPool() | 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求|
104107
| newSingleThreadExecutor() | 创建单个线程的线程池,始终保证线程池中会有一个线程在。当某线程死去,会找继任者 |
105-
| defaultThreadFactory() | 创建一个默认线程池工厂 |
108+
| defaultThreadFactory() | 创建一个默认线程池工厂|
106109

107110
# **6. 线程池**
108111
在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程,这就是封装

第5章 多线程/线程范围内共享数据.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ B from Thread-1 get data:311124475
6767
###**2.1 ThreadLocal的作用和目的**
6868
用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据。
6969

70-
2、 每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。在线程结束时可以调用ThreadLocal.clear()方法,这样会更快释放内存,不调用也可以,因为线程结束后也可以自动释放相关的ThreadLocal变量。
70+
每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。在线程结束时可以调用ThreadLocal.clear()方法,这样会更快释放内存,不调用也可以,因为线程结束后也可以自动释放相关的ThreadLocal变量。
7171

7272
##**3. ThreadLocal的应用场景**
7373

第5章 多线程/线程锁技术.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ public class CacheDemo {
111111
# 2. **Condition**
112112

113113
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法wait和notify的使用
114-
114+
115115
一个锁内部可以有多个Condition,即有多路等待通知,传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象。使用一个监视器往往会产生顾此失彼的情况。
116-
116+
117117
在等待 Condition 时,允许发生“虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为 Condition 应该总是在一个循环中被等待,并测试正被等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。
118118

119119
Condition的应用:阻塞队列(使用了两个监视器)

0 commit comments

Comments
 (0)