高并发

2019-10-21  本文已影响0人  唐騦忆
  1. 引入:StringBuffer与StringBuider区别
    前者是多线程安全的,后者是非多线程安全的,但是效率更高。
  2. 进程与线程
    进程:一个独立的程序执行过程。
    线程:建立在进程的基础之上,一个进程由一个或者多个线程组成。

        DeathThead test01 = new DeathThead();
        DeathThead test02 = new DeathThead();
        new Thread(test01::m1).start();
        new Thread(test02::m2).start();

  1. 多线程优势与弊端
    优势:并发执行,速度快。
    劣势:需要控制变量操作为原子操作,否则会出现不同步。
  2. 锁:synchronize
    互斥锁,锁定对象(或this),只有拿到锁,才能进行操作。
    支持同步执行,同一线程的同一类可以拿多次,子类可以调用父类同步方法。
    Object a = new Object();
    Object b = new Object();
    public void m1(){
        synchronized (a) {
            System.out.println("m1锁a");
        }
        try {
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        synchronized (b){
            System.out.println("m1锁b");
        }

    }
  public synchronized void m2(){
  }

synchronized线程出现异常默认会释放锁。
如果不想释放锁,需要添加trycatch方法。
如果在锁定过程中对象被重新创建,锁会被释放。

死锁
线程1需要先锁定A后锁定B,线程2需要先锁定B后锁定A。
线程1锁定了A,线程2锁定了B。
导致两个线程无法解锁,故称为死锁。

  1. volatile
    线程之间的内存缓冲区彼此可见。
    某一线程的cpu缓冲区读主内存数据->修改当前缓冲区数据->
    修改主内存数据----------->通知其他线程cpu更新缓冲区内容。
替代方案:
1.使用synchronize
优点:同时保证可见性与原子性,
缺点:过于笨重,影响效率。
2.使用sleep
优点:简单,
缺点:不可靠
  1. 原子类与原子方法
Atomic...

incrementAndGet()
#相当于++
#效率高于synchronize,但方法有限。
#多个原子方法一起不一定具有原子性。

上一篇下一篇

猜你喜欢

热点阅读