Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

112 changes: 112 additions & 0 deletions Java应届生面试突击/多线程和并发/07_其他问题.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,120 @@


### <a name="1">1. ThreadLocal 的原理</a>
&ensp;&ensp;&ensp;&ensp;
ThreadLocal 相当于一个容器, 用于存放每个线程的局部变量。
ThreadLocal 实例通常来说都是 private static 类型的。 ThreadLocal 可以
给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证
不同的线程都有一份拷贝。 <br>
&ensp;&ensp;&ensp;&ensp;
一般情况下,通过 ThreadLocal.set() 到线程中的对象是该线程自己使用
的对象,其他线程是访问不到的,各个线程中访问的是不同的对象。如果
ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个
线程的 ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问
题。 <br>
&ensp;&ensp;&ensp;&ensp;
向 ThreadLocal 中 set 的变量是由 Thread 线程对象自身保存的,当用户
调 用 ThreadLocal 对象的 set(Object o) 时 , 该方法则通过
Thread.currentThread() 获取当前线程, 将变量存入线程中的
ThreadLocalMap 类的对象内,Map 中元素的键为当前的 threadlocal 对象,
而值对应线程的变量副本。 <br>

```java
public T get() {
Thread t = Thread.currentThread(); //每个 Thread 对象内都保存一个 ThreadLocalMap 对象。
ThreadLocalMap map = getMap(t); //map 中 元 素 的 键 为 共 用 的
threadlocal 对象,而值为对应线程的变量副本。
if (map != null)
return (T)map.get(this);
}
T value = initialValue();
createMap(t, value);
return value;
}

public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}

ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}

void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}

```
### <a name="2">2. Collections.synchronizedXX 方法的原理。</a>

```java
public E get(int index) {
synchronized (mutex) {return list.get(index);}
}

public E set(int index, E element) {
synchronized (mutex) {return list.set(index,element);}
}

public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}

public E remove(int index) {
synchronized (mutex) {return list.remove(index);}
}

```
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:

```java
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
```
### <a name="3">3. 如何在两个线程间共享数据?</a>
#### 一、每个线程执行的代码相同
&ensp;&ensp;&ensp;&ensp;
若每个线程执行的代码相同,共享数据就比较方便。可以使用同一个
Runnable 对象,这个 Runnable 对象中就有那个共享数据。
```java
public class MultiThreadShareData1 {
public static void main(String[] args) {
SaleTickets sale = new SaleTickets();
new Thread(sale).start();
new Thread(sale).start();
}
}

class SaleTickets implements Runnable {
public int allTicketCount = 20;

public void run() {
while (allTicketCount > 0) {
sale();
}
}

public synchronized void sale() {
System.out.println("剩下" + allTicketCount);
allTicketCount--;
}
}
```
#### 二、每个线程执行的代码不相同
&ensp;&ensp;&ensp;&ensp;
如果每个线程执行的代码不同,这时候需要用不同的 Runnable 对象,将需要共享的
数据封装成一个对象,将该对象传给执行不同代码的 Runnable 对象。



---
Expand Down
75 changes: 0 additions & 75 deletions data/books/面试强化资料/Java面试强化测试题.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,81 +125,6 @@
11、各种回收算法? <br>
12、说下OOM错误,stackoverflow错误,permgen space错误? <br>

### Java基础综合
1、集合类以及集合框架;HashMap与HashTable实现原理,线程安全性,hash冲突及处理算法;ConcurrentHashMap <br>
2、进程和线程的区别? <br>
3、Java的并发、多线程、线程模型? <br>
4、什么是线程池,如何使用? <br>
5、数据一致性如何保证? <br>
*注意点:* <br>
Synchronized关键字,类锁,方法锁,重入锁;<br>
6、Java中实现多态的机制是什么? <br>
7、如何将一个Java对象序列化到文件里? <br>
8、说说你对Java反射的理解? <br>
9、同步的方法;多进程开发以及多进程应用场景? <br>
10、在Java中wait和seelp方法的不同? <br>
*注意点:* <br>
最大的不同是在等待时wait 会释放锁,而sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行。 <br>
11、synchronized 和volatile 关键字的作用和区别? <br>
*注意点:* <br>
volatile 本质是在告诉jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronized 则是锁定当前变量,只有当前线程可以访问该变量,
其他线程被阻塞住。 <br>
(1).volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的 <br>
(2).volatile 仅能实现变量的修改可见性,并不能保证原子性;synchronized 则可以保证变量的修改可见性和原子性 <br>
(3).volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。 <br>
(4).volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化 <br>
12、服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达? <br>
13、ThreadLocal原理,实现及如何保证Local属性? <br>
14、String StringBuilder StringBuffer对比? <br>
15、你所知道的设计模式有哪些? <br>
*注意点:* <br>
(Java 中一般认为有23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。
需要掌握的设计模式我单独列出来了,当然能掌握的越多越好。 <br>
总体来说设计模式分为三大类: <br>
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 <br>
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 <br>
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
16、Java如何调用c、c++语言? <br>
17、接口与回调;回调的原理;写一个回调demo; <br>
18、泛型原理,举例说明; <br>
*注意点:* <br>
解析与分派; <br>
19、抽象类与接口的区别;应用场景;抽象类是否可以没有方法和属性; <br>
20、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? <br>
21、修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法? <br>
22、说说你对泛型的了解? <br>
23、Java的异常体系? <br>
24、如何控制某个方法允许并发访问线程的个数? <br>
25、动态代理的区别,什么场景使用? <br>
26、Dex加载过程和优化方式? <br>
27、Jvm和Gc机制? <br>

### 叙述下令你印象最深刻的项目;
*注意点:* <br>
1、明确项目是做什么的 <br>
2、明确项目的价值。
*注意点:* <br>
(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?) <br>
3、明确项目的功能。
*注意点:* <br>
(这个项目涉及哪些功能?) <br>
4、明确项目的技术。
*注意点:* <br>
(这个项目用到哪些技术?(技术选型)) <br>
5、明确个人在项目中的位置和作用。
*注意点:* <br>
(你在这个项目的承担角色?) <br>
6、明确项目的整体架构。 <br>
7、明确项目的优缺点,如果重新设计你会如何设计。 <br>
8、明确项目的亮点。
*注意点:* <br>
(这个项目有什么亮点?or难点解决方案) <br>
9、明确技术成长。
*注意点:* <br>
(你通过这个项目有哪些技术成长?)

---
### 搬运工信息
Author:Jason Lou <br>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@
&ensp;&ensp;&ensp;&ensp; ♦ <a href="./Java应届生算法突击_目录.md#229">其他(15道)</a> <br>

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

---

Expand Down