建设企业网站就等于开展网络营销,WordPress有什么作用,搬瓦工做网站稳定吗,网店推广怎么做什么是进程#xff1a; 你把它理解成一个软件
什么是线程#xff1a; 你把它理解成软件里面的一个功能#xff0c;做的事情
什么是多线程#xff1a; 你把它理解成 软件里面的某一个功能#xff0c;原先是一个人累死累活的在那里完成#xff0c;现在好了#xff0c;多…什么是进程 你把它理解成一个软件
什么是线程 你把它理解成软件里面的一个功能做的事情
什么是多线程 你把它理解成 软件里面的某一个功能原先是一个人累死累活的在那里完成现在好了多个人一起完成轻松又快活
什么是线程不安全 你把它理解成 软件里面的某一个功能原先是一个人累死累活的在那里完成虽然累但是数据不会出错但是现在多个人一起来弄结果张三读取的数据是被李四修改过的数据不是最新的数据这样就是线程不安全的
什么是线程安全 你把它理解成 软件里面的某一个功能原先是一个人累死累活的在那里完成虽然累但是数据不会出错但是现在多个人一起来弄我让你们排好队一个一个有序的来操作数据如果有人正在操作我就让你在外面等着必须等前面的人做完了自己的事情你才能进去
什么是并行 你把它理解成 软件里面的某一个功能同时进行多个任务
什么是并发 你把它理解成 软件里面的某一个功能一下子来了很多请求如果不处理会导致程序宕机卡死等
线程不安全和线程安全
针对ArrayList HashSet HashMap 来进行举例
ArrayLists 线程不安全 Vector、Collections 、CopyOnWriteArrayList 线程安全
HashSet 线程不安全 CopyOnWriteArraySet 线程安全
HashMap 线程不安全 ConcurrentHashMap 线程安全 下面用代码的方式来进行模拟一下多线程
需求四位售票员进行卖票操作加锁
package com.japhet.util;//卖票
class Ticket{//总票数private int ticket 3000;//卖票逻辑递减public synchronized void seal(){if(ticket0){return;}ticket--;System.out.println(Thread.currentThread().getName()票还剩余ticket);}}public class ThreadUtils {public static void main(String[] args) {Ticket ticket new Ticket();//售票员1进行卖票new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 4000; i) {ticket.seal();}}},AA).start();//售票员2进行卖票new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 4000; i) {ticket.seal();}}},BB).start();//售票员3进行卖票new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 4000; i) {ticket.seal();}}},CC).start();//售票员4进行卖票new Thread(()-{for (int i 0; i 4000; i) {ticket.seal();}},DD).start();}
}下面用代码的方式来进行模拟一下线程之间的通讯
需求因为是多线程当11线程抢到资源执行完自己的程序之后他是不知道下一次会是谁成功的抢到资源那我可以进行设置谁能抢到资源 通过 await 等待 signal 通知某个线程执行这里就让11线程执行了就让22线程去执行22线程执行了就让33线程去执行33线程执行了就让11线程执行依次循环10次这个动作
package com.japhet.util;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class Srouce{
// 线程标识private int temp 1;// 锁private Lock lock new ReentrantLock();// 三个线程private Condition condition1 lock.newCondition();private Condition condition2 lock.newCondition();private Condition condition3 lock.newCondition();public void test(){lock.lock();try {while (temp!1){//防止虚假唤醒所以得用while循环condition1.await();}System.out.println(线程1111进来了);temp 2;//修改标识condition2.signal();//通知线程2去干活}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}public void test2(){lock.lock();try {while (temp!2){//防止虚假唤醒所以得用while循环condition2.await();}System.out.println(线程2222进来了);temp 3;//修改标识condition3.signal();//通知线程2去干活}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}public void test3(){lock.lock();try {while (temp!3){//防止虚假唤醒所以得用while循环condition3.await();}System.out.println(线程3333进来了);temp 1;//修改标识condition1.signal();//通知线程2去干活}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
}public class ThreadUtils2 {public static void main(String[] args) {Srouce srouce new Srouce();new Thread(()-{for (int i 0; i 10; i) {srouce.test();}},11).start();new Thread(()-{for (int i 0; i 10; i) {srouce.test2();}},22).start();new Thread(()-{for (int i 0; i 10; i) {srouce.test3();}},33).start();}}