Java_基础—多线程(线程安全问题)
来源:互联网 发布:扫描仪专用软件 京瓷 编辑:程序博客网 时间:2024/05/17 22:24
一、继承Thread类
- 多线程并发操作同一数据时, 就有可能出现线程安全问题
- 使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作
需求:铁路售票,一共100张票,通过四个窗口卖完.
package com.soar.syn;public class Demo3_Ticket { /* * 需求:铁路售票,一共100张,通过四个窗口卖完. */ public static void main(String[] args) { new Ticket().start(); new Ticket().start(); new Ticket().start(); new Ticket().start(); }}class Ticket extends Thread{ private static int ticket = 100; //private static Object obj = new Object(); //如果用应用数据类型的成员变量当作锁对象,必须是静态的 public void run(){ while(true){ synchronized(Ticket.class){ if(ticket == 0){ break; } try { Thread.sleep(10); //线程1睡,线程2睡,线程3睡,线程4睡 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(getName()+"这是第"+ ticket-- + "号票"); } } }}
二、使用Runnable接口
package com.soar.syn;public class Demo4_Ticket { /* * 火车站卖票的例子用实现Runnable接口 */ public static void main(String[] args) { MyTicket mt = new MyTicket(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); //多次启动一个线程是非法的 /*Thread t1 = new Thread(mt); t1.start(); t1.start(); t1.start(); t1.start();*/ }}class MyTicket implements Runnable{ private int ticket = 100; @Override public void run() { while(true){ synchronized(Ticket.class){ //锁对象也可以用this if(ticket == 0){ break; } try { Thread.sleep(10); //线程1睡,线程2睡,线程3睡,线程4睡 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"这是第"+ ticket-- + "号票"); } } }}
三、一些相关的线程安全类
- Vector是线程安全的
- ArrayList是线程不安全的
- StringBuffer是线程安全的
- StringBuilder是线程不安全的
- Hashtable是线程安全的
- HashMap是线程不安全的
Collections.synchroinzed(xxx)可以将线程不安全的类转换为线程安全的类
阅读全文
0 0
- Java_基础—多线程(线程安全问题)
- Java_基础—多线程(死锁)
- Java_基础—多线程(Timer计时器)
- Java_多线程基础
- 多线程:线程的安全问题
- 一心多用多线程-线程安全问题
- Java 多线程 线程安全问题
- java_基础_线程
- java语言基础(91)——多线程(同步方法解决线程安全问题)
- Java基础——多线程的安全问题
- Java_多线程_线程状态
- Java_基础—多线程(匿名内部类实现线程的两种方式和设置名字的方法)
- C#多线程和线程安全问题
- 多线程-02,线程安全问题解决
- 线程详解、多线程及安全问题
- Java多线程____线程安全问题
- Java多线程____Servlet线程安全问题
- Java_基础—多线程(同步代码块和同步方法)
- webgl学习笔记二
- SSH综合项目实战(快递) -- day02 EasyUI菜单、实体类导入、spring data使用
- 网络协议
- adb wifi连接手机调试
- linux下在线安装redis
- Java_基础—多线程(线程安全问题)
- 【笔试题】拼多多1小熊吃糖果
- 170828 WarGames-Narnia(3)
- mongodb意外退出问题解决
- 仿各种客户端都具备的评分控件
- 搭建WordPress 个人博客
- Mac虚拟机安装XCode 配置opencv
- Java自定义框架初步(一)
- 链表的删除、插入、反向