美文网首页
多线程学习(上)

多线程学习(上)

作者: 啊啊啊哼哼哼 | 来源:发表于2020-03-04 21:42 被阅读0次

为什么需要多线程?

  • CPU/内存/IO巨大的性能差异;
  • 多核CPU的发展;
  • 多线程可以使得多个执行流,并发执行。

多线程的缺点?

  • 占用资源:每个线程有独立的方法栈(方法栈里保存有局部变量表和操作数栈);
  • 上下文切换。

Thread底层模型?

  • Thread在Linux称为轻量级进程,和进程并没有本质的区别,都有自己的PID;唯一的区别就是一个进程内部的多个线程共享一个JVM内存,而多个线程之间内存独立,互不干扰。
  • 优点:1、简单,直接依赖操作系统的调度器;
  • 缺点:1、占用资源多,每个线程都有独立的方法栈;2、上下文切换;3、不灵活,不能实现灵活的优先级(因为依赖操作系统的调度器)。

Thread的生命周期?

  • new、runnale、terminated、blocked、waiting、time waiting


    Thread生命周期

ThreadLocal

协程

Runnable/Callable:

  • 都表示一个要被线程执行的任务
  • Runnable不能有返回值,不能抛出异常,Callable增加了这两个功能。
public interface Runnable {
    public abstract void run();
}
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

Java Memory Model

  • 方法中的局部变量是线程私有的(存在方法栈,栈只存基本数据类型和堆中对象的引用, String不是基本数据类型);
  • 除此以外其他东西都是线程共享的。


    JMM

什么是线程安全问题?

一个类在多线程环境下使用仍能表现出正常的行为

解决线程安全问题的办法:

  • 不可变对象;
  • 各种锁;
  • 并发工具包(底层通常是CAS)compare and swap:
    Boolean -> AtomicBoolean; int / long -> AtomicInteger/AtomicLong; [ ]->AtomicLongArray; Object->AtomicReference; HashMap -> ConcurrentHashMap; ArraysList -> CopyOnWriteArrayList; TreeMap->ConcurrentSkipListMap

手写一个死锁

public class DeadLock {
    static Object lock1 = new Object();
    static Object lock2 = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread newThread1 = new Thread(() -> {
            synchronized (lock1) {
                try {
                    Thread.sleep(10000);
                    synchronized (lock2) {
                        System.out.println(" lock2 ");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        newThread1.start();

        synchronized (lock2) {
            Thread.sleep(10000);
            synchronized (lock1) {
                System.out.println(" lock1 ");
            }
        }
    }
}

volatile

  • 保证可见性,并非原子性;写入volatile变量会直接写入主内存,读取volatile变量会直接读取主内存。(是一个非常弱的同步机制)
  • 禁止指令重排:编译器和处理器都可能对指令进行重排,导致出现问题。
  • 有同步的时候不需要volatile:synchronized, Lock, AtomicInteger

相关文章

网友评论

      本文标题:多线程学习(上)

      本文链接:https://www.haomeiwen.com/subject/bnkilhtx.html