1、JUC是什么
全称:java.util.concurrent 在并发编程中使用的工具类
2、进程/线程是什么
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
3、wait/sleep的区别
wait放开手去睡,放开手里的锁
sleep握紧手去睡,醒了手里还有锁
4、总结
* 1 高聚低合前提下,线程操作资源类 * 2 判断、干活、通知 * 3 多线程交换中,必须要防止多线程虚假唤醒,也即(判断只用while,不能用if)
package com.cb.demo.example;
class AirConditioner
{
private int number=0;
public synchronized void increment() throws InterruptedException {
//老版本方法加synchronized
//1 判断
while (number !=0){
this.wait();
}
//2 干活
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
//老版本方法加synchronized
//1 判断
while (number ==0){
this.wait();
}
//2 干活
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
this.notifyAll();
}
}
/**
* 题目:现在两个线程,可以操作初始化值为零的一个变量,
* 实现一个线程对该变量加1,一个线程对该变量减1,
* 实现交替,来10轮,变量初始值为零
*
* 1 高聚低合前提下,线程操作资源类
* 2 判断、干活、通知
* 3 多线程交换中,必须要防止多线程虚假唤醒,也即(判断只用while,不能用if)
*/
public class ThreadWaitNotifyDemo {
public static void main(String[] args) {
AirConditioner airConditioner = new AirConditioner();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
Thread.sleep(2000);
airConditioner.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
Thread.sleep(3000);
airConditioner.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
Thread.sleep(4000);
airConditioner.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
Thread.sleep(5000);
airConditioner.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
新版
package com.cb.demo.example;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class AirConditioner
{
private int number=0;
private Lock lock=new ReentrantLock();
private Condition condition=lock.newCondition();
public void increment() throws InterruptedException {
lock.lock();
try{
//1 判断
while (number !=0){
//this.wait();
condition.await();
}
//2 干活
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
//this.notifyAll();
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void decrement() throws InterruptedException {
lock.lock();
try{
//1 判断
while (number ==0){
//this.wait();
condition.await();
}
//2 干活
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
//this.notifyAll();
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
/* public synchronized void increment() throws InterruptedException {
//老版本方法加synchronized
//1 判断
while (number !=0){
this.wait();
}
//2 干活
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
//老版本方法加synchronized
//1 判断
while (number ==0){
this.wait();
}
//2 干活
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//3 通知
this.notifyAll();
}*/
}
/**
* 题目:现在两个线程,可以操作初始化值为零的一个变量,
* 实现一个线程对该变量加1,一个线程对该变量减1,
* 实现交替,来10轮,变量初始值为零
*
* 1 高聚低合前提下,线程操作资源类
* 2 判断、干活、通知
* 3 多线程交换中,必须要防止多线程虚假唤醒,也即(判断只用while,不能用if)
*/
public class ThreadWaitNotifyDemo {
public static void main(String[] args) {
AirConditioner airConditioner = new AirConditioner();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
//Thread.sleep(2000);
airConditioner.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
// Thread.sleep(3000);
airConditioner.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
// Thread.sleep(4000);
airConditioner.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(()->{
for (int i = 0; i <10 ; i++) {
try {
//Thread.sleep(5000);
airConditioner.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
1196

被折叠的 条评论
为什么被折叠?



