概念:java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类。
进程和线程:进程是一个独立应用程序;线程一个进程中有若然个线程,线程就是分配资源的最小单位。
并发与并行:并发是多个线程去访问同一个资源;并行是多项任务一起执行最后汇总。
sleep、wait区别:sleep是属于Thread类中的方法 不释放资源锁
wait是Object类中的方法 会释放索资源。
创建线程的方式:继承Thread类、实现Runnable、callable接口、线程池。
Runnable、Callable区别:Runnable实现了run方法、无返回值、无异常。
Callable实现了call方法、有返回值、有异常。
synchronized:只要出现资源抢占就会使用synchronized 可以作用在方法上、可以作用在类上 是独占的、可重入锁
1.对于普通同步方法,锁的是当前对象(this)。
2.对于静态同步方法,锁是当前类的Class对象。
3.对于同步方法块,锁是Synchonized括号里配置的对象。
synchronized底层:当synchronized修饰方法的时候,当前的方法会比普通的方法在常量池中多一个标识符,JVM在执行程序时,会根据这个标识符完成方法的同步。如果调用了
被synchronized的方法,就会检查是否设置了标识符。 如果设置了标识符,则当前线程先获取monitor对象。同一时刻,只会有一个线程获取monitor对象成功,进入方法体执行方法逻辑,
当前线程如果释放了monitor对象,其他线程无法获取同一个monitor对象,从而保证了线程的安全。
当synchronized修饰类的时候,是利用开始和结束两个字节码指令,当jvm执行到开始的指令时,当前线程就会尝试获取monitor对象的所有权
如果未加锁或者已经被当前线程所持有,就把锁的计数器+1;当执行monitorexit指令时,锁计数器-1;当锁计数器为0时,该锁就被释放了。
如果获取monitor对象失败,该线程则会进入阻塞状态,直到其他线程释放锁。