Skip to content

Commit ec09d4f

Browse files
authored
Merge pull request JGPY#4 from JGPY/dev
Dev
2 parents 8f0767a + 91c977b commit ec09d4f

6 files changed

Lines changed: 566 additions & 456 deletions

File tree

‎Java应届生面试突击/多线程和并发/06_多线程相关的问题.md‎

Lines changed: 453 additions & 380 deletions
Large diffs are not rendered by default.

‎Java应届生面试突击/多线程和并发/07_其他问题.md‎

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,120 @@
99

1010

1111
### <a name="1">1. ThreadLocal 的原理</a>
12+
&ensp;&ensp;&ensp;&ensp;
13+
ThreadLocal 相当于一个容器, 用于存放每个线程的局部变量。
14+
ThreadLocal 实例通常来说都是 private static 类型的。 ThreadLocal 可以
15+
给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证
16+
不同的线程都有一份拷贝。 <br>
17+
&ensp;&ensp;&ensp;&ensp;
18+
一般情况下,通过 ThreadLocal.set() 到线程中的对象是该线程自己使用
19+
的对象,其他线程是访问不到的,各个线程中访问的是不同的对象。如果
20+
ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个
21+
线程的 ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问
22+
题。 <br>
23+
&ensp;&ensp;&ensp;&ensp;
24+
向 ThreadLocal 中 set 的变量是由 Thread 线程对象自身保存的,当用户
25+
调 用 ThreadLocal 对象的 set(Object o) 时 , 该方法则通过
26+
Thread.currentThread() 获取当前线程, 将变量存入线程中的
27+
ThreadLocalMap 类的对象内,Map 中元素的键为当前的 threadlocal 对象,
28+
而值对应线程的变量副本。 <br>
29+
30+
```java
31+
public T get() {
32+
Thread t = Thread.currentThread(); //每个 Thread 对象内都保存一个 ThreadLocalMap 对象。
33+
ThreadLocalMap map = getMap(t); //map 中 元 素 的 键 为 共 用 的
34+
threadlocal 对象,而值为对应线程的变量副本。
35+
if (map != null)
36+
return (T)map.get(this);
37+
}
38+
T value = initialValue();
39+
createMap(t, value);
40+
return value;
41+
}
42+
43+
public void set(T value) {
44+
Thread t = Thread.currentThread();
45+
ThreadLocalMap map = getMap(t);
46+
if (map != null)
47+
map.set(this, value);
48+
else
49+
createMap(t, value);
50+
}
51+
52+
ThreadLocalMap getMap(Thread t) {
53+
return t.threadLocals;
54+
}
55+
56+
void createMap(Thread t, T firstValue) {
57+
t.threadLocals = new ThreadLocalMap(this, firstValue);
58+
}
59+
60+
```
1261
### <a name="2">2. Collections.synchronizedXX 方法的原理。</a>
62+
63+
```java
64+
public E get(int index) {
65+
synchronized (mutex) {return list.get(index);}
66+
}
67+
68+
public E set(int index, E element) {
69+
synchronized (mutex) {return list.set(index,element);}
70+
}
71+
72+
public void add(int index, E element) {
73+
synchronized (mutex) {list.add(index, element);}
74+
}
75+
76+
public E remove(int index) {
77+
synchronized (mutex) {return list.remove(index);}
78+
}
79+
80+
```
81+
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:
82+
83+
```java
84+
List list = Collections.synchronizedList(new ArrayList());
85+
...
86+
synchronized(list) {
87+
Iterator i = list.iterator(); // Must be in synchronized block
88+
while (i.hasNext())
89+
foo(i.next());
90+
}
91+
```
1392
### <a name="3">3. 如何在两个线程间共享数据?</a>
93+
#### 一、每个线程执行的代码相同
94+
&ensp;&ensp;&ensp;&ensp;
95+
若每个线程执行的代码相同,共享数据就比较方便。可以使用同一个
96+
Runnable 对象,这个 Runnable 对象中就有那个共享数据。
97+
```java
98+
public class MultiThreadShareData1 {
99+
public static void main(String[] args) {
100+
SaleTickets sale = new SaleTickets();
101+
new Thread(sale).start();
102+
new Thread(sale).start();
103+
}
104+
}
105+
106+
class SaleTickets implements Runnable {
107+
public int allTicketCount = 20;
108+
109+
public void run() {
110+
while (allTicketCount > 0) {
111+
sale();
112+
}
113+
}
114+
115+
public synchronized void sale() {
116+
System.out.println("剩下" + allTicketCount);
117+
allTicketCount--;
118+
}
119+
}
120+
```
121+
#### 二、每个线程执行的代码不相同
122+
&ensp;&ensp;&ensp;&ensp;
123+
如果每个线程执行的代码不同,这时候需要用不同的 Runnable 对象,将需要共享的
124+
数据封装成一个对象,将该对象传给执行不同代码的 Runnable 对象。
125+
14126

15127

16128
---

‎data/books/面试强化资料/Java面试强化测试题.md‎

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -125,81 +125,6 @@
125125
11、各种回收算法? <br>
126126
12、说下OOM错误,stackoverflow错误,permgen space错误? <br>
127127

128-
### Java基础综合
129-
1、集合类以及集合框架;HashMap与HashTable实现原理,线程安全性,hash冲突及处理算法;ConcurrentHashMap <br>
130-
2、进程和线程的区别? <br>
131-
3、Java的并发、多线程、线程模型? <br>
132-
4、什么是线程池,如何使用? <br>
133-
5、数据一致性如何保证? <br>
134-
*注意点:* <br>
135-
Synchronized关键字,类锁,方法锁,重入锁;<br>
136-
6、Java中实现多态的机制是什么? <br>
137-
7、如何将一个Java对象序列化到文件里? <br>
138-
8、说说你对Java反射的理解? <br>
139-
9、同步的方法;多进程开发以及多进程应用场景? <br>
140-
10、在Java中wait和seelp方法的不同? <br>
141-
*注意点:* <br>
142-
最大的不同是在等待时wait 会释放锁,而sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行。 <br>
143-
11、synchronized 和volatile 关键字的作用和区别? <br>
144-
*注意点:* <br>
145-
volatile 本质是在告诉jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
146-
synchronized 则是锁定当前变量,只有当前线程可以访问该变量,
147-
其他线程被阻塞住。 <br>
148-
(1).volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的 <br>
149-
(2).volatile 仅能实现变量的修改可见性,并不能保证原子性;synchronized 则可以保证变量的修改可见性和原子性 <br>
150-
(3).volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。 <br>
151-
(4).volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化 <br>
152-
12、服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达? <br>
153-
13、ThreadLocal原理,实现及如何保证Local属性? <br>
154-
14、String StringBuilder StringBuffer对比? <br>
155-
15、你所知道的设计模式有哪些? <br>
156-
*注意点:* <br>
157-
(Java 中一般认为有23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。
158-
需要掌握的设计模式我单独列出来了,当然能掌握的越多越好。 <br>
159-
总体来说设计模式分为三大类: <br>
160-
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 <br>
161-
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 <br>
162-
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
163-
)
164-
16、Java如何调用c、c++语言? <br>
165-
17、接口与回调;回调的原理;写一个回调demo; <br>
166-
18、泛型原理,举例说明; <br>
167-
*注意点:* <br>
168-
解析与分派; <br>
169-
19、抽象类与接口的区别;应用场景;抽象类是否可以没有方法和属性; <br>
170-
20、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? <br>
171-
21、修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法? <br>
172-
22、说说你对泛型的了解? <br>
173-
23、Java的异常体系? <br>
174-
24、如何控制某个方法允许并发访问线程的个数? <br>
175-
25、动态代理的区别,什么场景使用? <br>
176-
26、Dex加载过程和优化方式? <br>
177-
27、Jvm和Gc机制? <br>
178-
179-
### 叙述下令你印象最深刻的项目;
180-
*注意点:* <br>
181-
1、明确项目是做什么的 <br>
182-
2、明确项目的价值。
183-
*注意点:* <br>
184-
(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?) <br>
185-
3、明确项目的功能。
186-
*注意点:* <br>
187-
(这个项目涉及哪些功能?) <br>
188-
4、明确项目的技术。
189-
*注意点:* <br>
190-
(这个项目用到哪些技术?(技术选型)) <br>
191-
5、明确个人在项目中的位置和作用。
192-
*注意点:* <br>
193-
(你在这个项目的承担角色?) <br>
194-
6、明确项目的整体架构。 <br>
195-
7、明确项目的优缺点,如果重新设计你会如何设计。 <br>
196-
8、明确项目的亮点。
197-
*注意点:* <br>
198-
(这个项目有什么亮点?or难点解决方案) <br>
199-
9、明确技术成长。
200-
*注意点:* <br>
201-
(你通过这个项目有哪些技术成长?)
202-
203128
---
204129
### 搬运工信息
205130
Author:Jason Lou <br>
260 KB
Loading

‎readme.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
&ensp;&ensp;&ensp;&ensp; ♦ <a href="./Java应届生算法突击_目录.md#229">其他(15道)</a> <br>
109109

110110
&ensp;&ensp; <a href="./Java应届生算法突击_目录.md/#23">IV LeetCode_Top100</a> <br>
111-
&ensp;&ensp;&ensp;&ensp; ♦ <a href="./Java应届生算法突击_目录.md#231">整理中...</a> <br>
111+
&ensp;&ensp;&ensp;&ensp; ♦ <a href="./Java应届生算法突击_目录.md#23">001~100</a> <br>
112112

113113
---
114114

0 commit comments

Comments
 (0)