线程安全并发包

编程入门 行业动态 更新时间:2024-10-28 18:30:28

<a href=https://www.elefans.com/category/jswz/34/1771240.html style=线程安全并发包"/>

线程安全并发包

线程安全&并发包

能够使用同步代码块解决线程安全问题(重点)synchronized(锁对象){访问了共享数据的代码(产生了线程安全问题的代码)}
能够使用同步方法解决线程安全问题(重点)1.把访问了共享数据的代码,提取出来放到一个方法中2.在方法上添加一个同步关键字synchronized权限修饰符 synchronized 返回值类型 方法名(参数){访问了共享数据的代码(产生了线程安全问题的代码)}
能够说明volatile关键字和synchronized关键字的区别volatile关键字:只能修饰变量,可以解决变量的可见性,有序性,不能解决原子性synchronized关键字:不能修饰变量,可以修饰方法,代码块,使用的范围比volatile广,可以解决:可见性,有序性,原子性
能够描述ConcurrentHashMap类的作用(重点)多线程安全的Map集合,效率比Hashtable高
能够描述CountDownLatch类的作用作用:计数器 一个线程先执行一部分,然后等待其他线程执行完毕,然后线程在继续执行.
能够描述CyclicBarrier类的作用作用:计数器 一个线程等待其他多个线程全部执行完毕,再执行(5个人都到,在开会)
能够描述Semaphore类的作用作用:控制并发数量,可以允许几个线程同时进入执行  synchronized只允许一个线程进入执行
能够描述Exchanger类的作用作用:两个线程信息交换

第一章 线程安全

之前我们讲过的AtomicInteger可以对“int类型的变量”做原子操作。但如果需要将“很多行代码”一起作为“原子性”执行——一个线程进入后,必须将所有代码行执行完毕,其它线程才能进入,可以使用synchronized关键字——重量级的同步关键字。

AtomicInteger:只能解决一个变量的原子性

synchronized:可以解决一段代码的原子性

1.卖票产生线程安全问题的概述(了解)

2.卖票产生线程安全问题的代码实现(重点)

package com.itheima.demo01payTicket;/*卖票案例:创建3个线程,卖同100张票(共享的数据)*/
public class Demo01PayTicket {public static void main(String[] args) {//创建Runnable接口的实现类对象RunnableImpl run = new RunnableImpl();//创建3个线程,卖同100张票Thread t0 = new Thread(run);Thread t1 = new Thread(run);Thread t2 = new Thread(run);t0.start();t1.start();t2.start();}
}
package com.itheima.demo01payTicket;public class RunnableImpl implements Runnable{//定义一个供所有线程共享的票源private int ticket = 100;//线程任务:卖票@Overridepublic void run() {//增加一个死循环,让线程重复卖票while (true){//判断ticket大于0,进行卖票if(ticket>0){//卖票需要10毫秒,让程序睡眠10毫秒try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程正在卖第"+ticket+"张票!");ticket--;}else{break;}}}
}
Thread-0线程正在卖第100张票!
Thread-1线程正在卖第100张票!
Thread-2线程正在卖第100张票!
Thread-2线程正在卖第97张票!
Thread-1线程正在卖第96张票!
Thread-0线程正在卖第95张票!
Thread-2线程正在卖第94张票!
Thread-0线程正在卖第94张票!
Thread-1线程正在卖第94张票!
...
Thread-2线程正在卖第13张票!
Thread-1线程正在卖第13张票!
Thread-1线程正在卖第10张票!
Thread-0线程正在卖第10张票!
Thread-2线程正在卖第10张票!
Thread-0线程正在卖第7张票!
Thread-2线程正在卖第7张票!
Thread-1线程正在卖第7张票!
Thread-1线程正在卖第4张票!
Thread-2线程正在卖第4张票!
Thread-0线程正在卖第4张票!
Thread-0线程正在卖第1张票!
Thread-2线程正在卖第0张票!
Thread-1线程正在卖第-1张票!


继承方式卖票代码

package com.itheima.demo01payTicket;public class MyThread extends Thread {//定义一个供所有线程共享的票源private static int ticket = 100;//线程任务:卖票@Overridepublic void run() {//增加一个死循环,让线程重复卖票while (true){//判断ticket大于0,进行卖票if(ticket>0){//卖票需要10毫秒,让程序睡眠10毫秒try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程正在卖第"+ticket+"张票!");ticket--;}else{break;}}}
}
package com.itheima.demo01payTicket;public class Demo02PayTicket {public static void main(String[] args) {//创建3个线程,卖同100张票MyThread t0 = new MyThread();MyThread t1 = new MyThread();MyThread t2 = new MyThread();t0.start();t1.start();t2.start();}
}

3.线程安全问题的产生原理(了解-扩展知识点)

4.解决线程安全问题的第一种方式使用同步代码块(重点)

package com.itheima.demo02synchronized;/*卖票案例出现了线程安全问题,卖出了重复的票和不存在的票解决线程安全问题的第一种方式:使用同步代码块格式:synchronized(锁对象){访问了共享数据的代码(产生了线程安全问题的代码)}注意:1.同步代码块中的锁对象可以任意的对象  new Person()  new Object   "aaa"2.必须保证所有线程使用的都是同一个锁对象原理:使用一个锁对象,把同步代码块中的代码锁住,只让一个线程获取锁对象,进入到同步中执行,保证安全*/
public class RunnableImpl implements Runnable{//定义一个供所有线程共享的票源private int ticket = 100;//定义一个锁对象//Person p = new Person();//Object obj = new Object();String str = "abc";//new char[]{'a','b','c'};//线程任务:卖票@Overridepublic void run() {//增加一个死循环,让线程重复卖票while (true){//创建同步代码块synchronized (str){//判断ticket大于0,进行卖票if(ticket>0){//卖票需要10毫秒,让程序睡眠10毫秒try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程正在卖第"+ticket+"张票!");ticket--;}else{break;}}}}
}
package com.itheima.demo02synchronized;/*卖票案例:创建3个线程,卖同100张票(共享的数据)*/
public class Demo01PayTicket {public static void main(String[] args) {//创建Runnable接口的实现类对象RunnableImpl run = new RunnableImpl();//创建3个线程,卖同100张票Thread t0 = new Thread(run);Thread t1 = new Thread(run);Thread t2 = new Thread(run);t0.start();t1.start();t2.start();}
}

5.同步的原理(了解-扩展知识点)

6.解决线程安全问题的第二种方式:使用同步方法(重点)

package com.itheima.demo03synchronized;/*卖票案例出现了线程安全问题,卖出了重复的票和不存在的票解决线程安全问题的第二种方式:使用同步方法原理:把访问了共享数据的代码,提取出来放到一个方法中在方法上添加一个同步关键字synchronized底层也是使用一个锁对象,把同步方法锁住,只让一个线程进入到方法中执行,保证安全格式:权限修饰符 synchronized 返回值类型 方法名(参数列表){访问了共享数据的代码(产生了线程安全问题的代码)}*/
public class RunnableImpl implements Runnable{//定义一个供所有线程共享的票源private static int ticket = 100;//线程任务:卖票@Overridepublic void run() {System.out.println("this:"+this);//增加一个死循环,让线程重复卖票while (true){//调用同步方法//payTicket();//调用静态同步方法payTicketStatic();if(ticket<=0){break;}}}/*定义一个静态的同步方法(了解)静态同步方法的锁对象是谁?是this吗? 不是 静态方法优先加载到静态区中,还没有this那(对象)静态方法使用的锁对象是本类的class文件对象(反射)RunnableImpl.class==>唯一*/public static /*synchronized*/ void payTicketStatic(){synchronized (RunnableImpl.class){//判断ticket大于0,进行卖票if(ticket>0){//卖票需要10毫秒,让程序睡眠10毫秒try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程正在卖第"+ticket+"张票!");ticket--;}}}/*定义一个同步方法同步方法的锁对象是谁?是this==>本类对象引用==>RunnableImpl run = new RunnableImpl();run:com.itheima.demo03synchronized.RunnableImpl@4554617cthis:com.itheima.demo03synchronized.RunnableImpl@4554617c*/public synchronized void payTicket(){//判断ticket大于0,进行卖票if(ticket>0){//卖票需要10毫秒,让程序睡眠10毫秒try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程正在卖第"+ticket+"张票!");ticket--;}}/*public  void payTicket(){synchronized (this){//判断ticket大于0,进行卖票if(ticket>0){//卖票需要10毫秒,让程序睡眠10毫秒try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程正在卖第"+ticket+"张票!");ticket--;}}}*/}
package com.itheima.demo03synchronized;/*卖票案例:创建3个线程,卖同100张票(共享的数据)*/
public class Demo01PayTicket {public static void main(String[] args) {//创建Runnable接口的实现类对象RunnableImpl run = new RunnableImpl();System.out.println("run:"+run);//创建3个线程,卖同100张票Thread t0 

更多推荐

线程安全并发包

本文发布于:2024-02-06 07:39:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1747739.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!