进程:一个程序,QQ.exe  Music.exe  程序的集合;
并发编程:并发、并行
并发(多线程操作同一个资源)
CPU 一核 ,模拟出来多条线程,天下武功,唯快不破,快速交替
并行(多个人一起行走)
CPU 多核 ,多个线程可以同时执行; 线程
Synchronized(Java内置关键字)和Lock(接口)
1、Synchronized 内置的Java关键字, Lock 是一个Java类
2、Synchronized  无法判断获取锁的状态,Lock  可以判断是否获取到了锁
3、Synchronized  会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁
 4、Synchronized   线程 1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下 去;
5、Synchronized    可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以 自己设置);
6、Synchronized     适合锁少量的代码同步问题,Lock  适合锁大量的同步代码
这里主要讲Lock接口
实现类ReentrantLock无参构造默认是非公平锁 传入true既是公平锁,
 public static void main(String[] args) {
        //  System.out.println(Runtime.getRuntime().availableProcessors());
        Tic tic=new Tic();
        new Thread(()->{ for (int i = 0; i <50 ; i++) tic.sale();},"A").start();
        new Thread(()->{ for (int i = 0; i <50 ; i++) tic.sale();},"B").start();
        new Thread(()->{ for (int i = 0; i <50 ; i++) tic.sale();},"C").start();
    }
}
class Tic1{
    int num=50;
    public void sale(){
        java.util.concurrent.locks.Lock lock=new ReentrantLock();
        lock.lock(); //加锁
        try {
            if(num>0){
                System.out.println(Thread.currentThread().getName()+"卖出"+(num--)+"票 剩余"+num);
            }
        }catch (Exception e){
        }finally {
            lock.unlock();  //解锁
        }
?
    }
Condition 精准的通知和唤醒线程
public class PcTo {
    public static void main(String[] args) {
        //  System.out.println(Runtime.getRuntime().availableProcessors());
        Tic3 tic=new Tic3();
            new Thread(()->{ for (int i = 0; i <10 ; i++) {
                try {
                    tic.add();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            },"A").start();
            new Thread(()->{ for (int i = 0; i <10 ; i++) {
                try {
                    tic.remove();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            },"B").start();
?
        new Thread(()->{ for (int i = 0; i <10 ; i++) {
            try {
                tic.remove2();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        },"C").start();
?
?
    }
}
?
class Tic3{
    Lock lock=new ReentrantLock();
    Condition condition1=lock.newCondition();
    Condition condition2=lock.newCondition();
    Condition condition3=lock.newCondition();
    int num=0;
    public  void add() throws InterruptedException {
        lock.lock(); //上锁
        try {
            while(num!=0){  //当num不等于0 通知其他线程
                condition1.await();  //等待
            }
            System.out.println(Thread.currentThread().getName()+":aaaa"+num);
            num=1;
            condition2.signal();
        }catch (Exception e){
?
        }finally {
            lock.unlock();
        }
?
    }
?
    public  void remove() throws InterruptedException {
        lock.lock(); //上锁
        try {
            while(num!=1){  //当num不等于0 通知其他线程
                condition2.await();  //等待
            }
            System.out.println(Thread.currentThread().getName()+":bbbbbbbbb"+num);
            num=