多线程技术

1. 死锁

知识前提:了解如何建立线程,了解什么是同步代码块,什么是锁。

public class Main {

    public static void main(String[] args) {
    // write your code here
        Test t1 = new Test(true);
        Test t2 = new Test(false);

        Thread TT1 = new Thread(t1);
        TT1.setName("咸鱼");
        TT1.start();
        Thread TT2 = new Thread(t2);
        TT2.setName("辣椒");
        TT2.start();
    }
}
public class Test implements Runnable {
    private boolean flag;
    Test(boolean flag) {
        this.flag = flag;
    }

    /*
    * run方法是线程的执行语句,死锁就是锁的嵌套
    * 何为嵌套:就是锁a和锁b,线程1拿着锁a,而且想要锁b;线程2拿着锁b而且想要锁a,
    * 此时就会发生两者都拿不到锁的情况,这两个线程就会进入僵持不下的阶段,
    * 谁都执行不了下一个语句,就产生了死锁
    * */
    
    public void run() {
        if (flag) {
            synchronized (MyLock.lockA) {
                System.out.println(Thread.currentThread().getName() + "...lockA...trueFLAG");
                synchronized (MyLock.lockB) {
                    System.out.println(Thread.currentThread().getName() + "...lockB...trueFLAG");
                }
            }
        }
        else {
            synchronized (MyLock.lockB) {
                System.out.println(Thread.currentThread().getName() + "...lockB...falseFLAG");
                synchronized (MyLock.lockA) {
                    System.out.println(Thread.currentThread().getName() + "...lockA...falseFLAG");
                }
            }
        }
    }
}

class MyLock {
    public static final Object lockA = new Object();
    public static final Object lockB = new Object();
}

2. 并发与并行的区别

并行才是我们通常认为的那个同时做多件事情,而并发则是在线程这个模型下产生的概念。并发表示同时发生了多件事情,通过时间片切换,哪怕只有单一的核心,也可以实现“同时做多件事情”这个效果。根据底层是否有多处理器,并发与并行是可以等效的,这并不是两个互斥的概念。举个我们开发中会遇到的例子,我们说资源请求并发数达到了1万。这里的意思是有1万个请求同时过来了。但是这里很明显不可能真正的同时去处理这1万个请求的吧!如果这台机器的处理器有4个核心,不考虑超线程,那么我们认为同时会有4个线程在跑。也就是说,并发访问数是1万,而底层真实的并行处理的请求数是4。如果并发数小一些只有4的话,又或者你的机器牛逼有1万个核心,那并发在这里和并行一个效果。也就是说,并发可以是虚拟的同时执行,也可以是真的同时执行。而并行的意思是真的同时执行。结论是:并行是我们物理时空观下的同时执行,而并发则是操作系统用线程这个模型抽象之后站在线程的视角上看到的“同时”执行。

引自:https://www.cnblogs.com/bughui/p/7422214.html

原文地址:https://www.cnblogs.com/xuhaojun/p/9108395.html