开始“复习”多线程啦,希望接下来,能把列出来的这些东西一一填满。hh,也算是给不知道怎么学多线程的小伙伴一个方向吧。有实践,有理论。学完也算是半个大佬了…至于另外半个,怎么不得结合数据库的事务学习下…
文章目录
多线程基础
1. Java中的并发包
1.1 ThreadLocal关键字
- 使用场景
- 实例在方法中共享
- 实现在线程间不共享
- 总结来说,就是一个全局变量。
- 演示实例
package Thread;
public class ThreadLocalTest {
private static ThreadLocal<String> localVar = new ThreadLocal<String>(); // threadlocal的全局变量
private static String s; // 普通的全局变量
static void print(String str) {
//打印当前线程中本地内存中本地变量的值
System.out.println(str + " :" + localVar.get());
//清除本地内存中的本地变量
localVar.remove();
System.out.println(s);
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
public void run() {
s = "I am A";
ThreadLocalTest.localVar.set("local_A");
try {
Thread.sleep(1000);
} catch ( Exception e) {
e.printStackTrace();
}
print("A");
//打印本地变量
System.out.println("after remove : " + localVar.get());
}
}).start();
new Thread(new Runnable() {
public void run() {
ThreadLocalTest.localVar.set("local_B");
s = "I am B";
print("B");
System.out.println("after remove : " + localVar.get());
}
}).start();
}
}
- 使用实例
- 存储用户的session
private static final ThreadLocal threadSession = new ThreadLocal();
public static Session getSession() throws InfrastructureException {
Session s = (Session) threadSession.get();
try {
if (s == null) {
s = getSessionFactory().openSession();
threadSession.set(s);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}
return s;
}
1.2 原子类
1.3 线程安全集合
1.4 同步队列
1.5 同步器
- countDownLanch
- barrier
1.6 线程池
1.7 锁与等待和阻塞
- 让出处理器的关键字
- Thread.sleep()
- Thread.yield()
- Thread.interrupt()
- Thread.join()
- wait();
- await();
2. 操作系统进程互斥的实现
需要满足的原则:
- 空闲让进
- 忙则等待
- 优先等待
- 让权等待