- 浏览: 1592705 次
- 来自: 上海
文章分类
- 全部博客 (374)
- Java (101)
- Struts (54)
- Oracle (30)
- JavaScript (16)
- Spring (27)
- Hibernate (16)
- MyEclipse (3)
- JSF (1)
- FreeMarker (2)
- SiteMesh (2)
- JfreeChart (2)
- Ibatis (2)
- JSP (12)
- MyBatis (4)
- SWFupload (1)
- EJB (4)
- Jboss (4)
- WebService (2)
- Linux (16)
- Android (2)
- XML (6)
- Java 网络编程 (13)
- AXIS2 (1)
- FTP (1)
- Jswing (1)
- Socket (3)
- 杂文选集 (6)
- solr (2)
- PS (1)
- Tomcat (7)
- JDBC (9)
- Highcharts (1)
- maven (1)
- Nodejs (0)
- navicat (2)
- Exception (5)
- eclipse (3)
- jQuery (1)
- springMVC (4)
- MySQL (11)
- SVN (1)
- Sql Server (1)
- zookeeper (1)
- JVM (1)
- Groovy (2)
- Git (1)
- Nginx (1)
- DynamicReport (1)
- IDEA (2)
- JasperReports (1)
- Postgresql (2)
- Mac (1)
- gradle (1)
- 数据结构算法 (1)
最新评论
-
hpu145:
引用引用
java 千分位的添加和去除 -
被遗忘的下路:
少了个junit-4.8.2的包
SSH2整合完整案例(四十三) -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
emoji 表情图片解决方法 -
caipeiming:
这个挺好JavaScript实现input输入框控件只允许输入 ...
js 控制文本框只能输入中文、英文、数字等 -
双子树:
东西太好啦受教啊
Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)
卖票安全问题
//线程出现安全问题啦 !!! 卖出了 0 -1 -2 号票了
//使用 synchronized 同步代码块 来解决
//使用 synchronized 同步函数 来解决
* 同步函数 用的是那一个锁呢 .????(this 锁)
main Test
静态同步函数 (Class 锁)
单例模式
死锁1
死锁2
//线程出现安全问题啦 !!! 卖出了 0 -1 -2 号票了
class SaleTicket1 implements Runnable{ private int ticks=100; private long time=1000; //加上这个后 就让安全问题 跟明显了 public void run(){ //复写接口中的方法 ,不能抛异常 ,只能try while(true){ if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); time=time-200; } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } } }
//使用 synchronized 同步代码块 来解决
class SaleTicket2 implements Runnable{ private int ticks=100; private long time=1000; //加上这个后 就让安全问题 跟明显了 Object obj=new Object(); public void run(){ //复写接口中的方法 ,不能抛异常 ,只能try while(true){ synchronized(obj){ //同步代码块 obj :称为锁 if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); time=time-200; } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } } } }
//使用 synchronized 同步函数 来解决
class SaleTicket3 implements Runnable{ private int ticks=100; private long time=1000; //加上这个后 就让安全问题 跟明显了 //Object obj=new Object(); public void run(){ //复写接口中的方法 ,不能抛异常 ,只能try while(true){ //synchronized(obj){ //同步代码块 obj :称为锁 this.show(); //} } } //同步函数 来解决 public synchronized void show(){ if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); time=time-200; } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } }
* 同步函数 用的是那一个锁呢 .????(this 锁)
/** * * 函数需要被对象调用, 那么函数都一个所属对象的引用,就是 this * 所以同步函数使用的锁是 this * * 通过程序来进行验证 同步函数使用的是 this * * 使用两个程序来买票 * 一个线程在不同步代码快找那个 * 一个线程在同步函数中 * 都在执行买票动作. * */ class SaleTicket implements Runnable{ private int ticks=1000; private long time=10; //加上这个后 就让安全问题更明显了 Object obj=new Object(); boolean flag=true; public void run(){ //复写接口中的方法 ,不能抛异常 ,只能try if(flag){ while(true){ /** * 发现 使用 obj 的时候 卖出的票 出现了 0 -1 -2 ,说明同步没有成功, * 找原因发现, 不满足线程同步第二个条件, 就是使用的不是同一个锁, * 把 obj 换成 this 试试 发现 结果正确了 由此 * */ synchronized(this){ //obj -->this if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); ///time=time-200; } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } } }else while(true) this.show(); } /* * 同步函数 用的是那一个锁呢 . * * 函数需要被对象调用, 那么函数都一个所属对象的引用,就是 this * 所以同步函数使用的锁是 this * */ public synchronized void show(){ if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); //time=time-200; } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } }
main Test
public class ThreadDemo1 { public static void main(String[] args) { SaleTicket t1=new SaleTicket(); Thread th1=new Thread(t1); //创建了一个线程 并将Runnable 子类对象给 Thread 构造函数 Thread th2=new Thread(t1); //Thread th3=new Thread(t1); //Thread th4=new Thread(t1); th1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t1.flag=false; th2.start(); //th3.start(); //th4.start(); //测试 同步函数使用的锁时候 ,只需要用 两个线程就可以了 其他的 4个 来测试 . } }
静态同步函数 (Class 锁)
/** * 如果同步函数被静态就是后,使用的锁是什么呢? * 通过验证,发现 不在是 this ,因为静态中不可以定义 this * * 静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象 * 类名.class 该对象的类型是Class * * 通过下面的测试 发现 * 静态的同步方法,使用的锁是该方法所在类的字节码文件对象, 类名 .calss * */ class SaleTicket implements Runnable{ private static int ticks=1000; private static long time=10; //加上这个后 就让安全问题更明显了 //Object obj=new Object(); boolean flag=true; public void run(){ //复写接口中的方法 ,不能抛异常 ,只能try if(flag){ while(true){ synchronized(SaleTicket.class){ //obj(不安全卖出了 0 号票) -->this(不安全卖出了 0 号票)--->SaleTicket.calss (安全了 发现从此没有卖出 0号票了) if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } } }else while(true) this.show(); } //静态 同步方法 public static synchronized void show(){ if(ticks>0){ try { if(time>0){ Thread.currentThread().sleep(time); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } } public class ClassLoaclDemo { public static void main(String[] args) { SaleTicket t1=new SaleTicket(); Thread th1=new Thread(t1); //创建了一个线程 并将Runnable 子类对象给 Thread 构造函数 Thread th2=new Thread(t1); th1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t1.flag=false; th2.start(); } }
单例模式
/** * 单例模式 * * //饿汉式 * class Single{ * private static final Single s=new Single(); * private Single(); * public static Single getInstance(){ * return s; * } * } * * * //懒汉式 * class Single{ * private static Single s=null; * private Single(){} * public static Single getInstance(){ * if(s=null) * s=new Single(); * return s; * } * * * * } * * * */ //懒汉式 加入 同步 效率比较低效 class Single{ private static Single s=null; private Single(){} //使用 同步函数 public static synchronized Single getInstance1(){ if(s==null) s=new Single(); return s; } //使用 同步代码快 public static Single getInstance(){ if(s==null){ //使用双重判断 增加 懒汉式 的效率 synchronized(Single.class){ if(s==null) s=new Single(); } } return s; } } public class SingleDemo { public static void main(String[] args) { // TODO Auto-generated method stub Single s =Single.getInstance(); } }
死锁1
/** * 死锁 * 通常,是同步中嵌套同步,但是锁不同 * */ class SaleTicket implements Runnable{ private int ticks=1000; private long time=10; Object obj=new Object(); boolean flag=true; public void run(){ if(flag){ while(true){ synchronized(obj){ //同步代码块 里面有同步 函数 show(); //this } } }else while(true) this.show(); //this } //同步函数里面有 同步代码块 public synchronized void show(){//使用的是 this synchronized(obj){ //这里确使用的 obj if(ticks>0){ try { if(time>0){ //Thread.sleep(time); Thread.currentThread().sleep(time); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+".....sale...."+ticks--); } } } } public class DeadLocalDemo { public static void main(String[] args) { SaleTicket t1=new SaleTicket(); Thread th1=new Thread(t1); //创建了一个线程 并将Runnable 子类对象给 Thread 构造函数 Thread th2=new Thread(t1); //Thread th3=new Thread(t1); //Thread th4=new Thread(t1); th1.start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t1.flag=false; th2.start(); //th3.start(); //th4.start(); } }
死锁2
** * 请写一个简单的死锁例子 */ class Test implements Runnable{ private boolean flag; Test(boolean flag){ this.flag=flag; } public void run(){ if(flag){ synchronized (MyLock.locka) { System.out.println("if locka"); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (MyLock.lockb) { System.out.println("if lockb"); } } }else{ synchronized (MyLock.lockb) { System.out.println("else lockb"); synchronized (MyLock.locka) { System.out.println("else locka"); } } } } } class MyLock{ static Object locka=new Object(); static Object lockb=new Object(); } public class DeadLocalTest { public static void main(String[] args) { Thread t1=new Thread(new Test(true)); Thread t2=new Thread(new Test(false)); t1.start(); t2.start(); } }
发表评论
-
检测一个字符串是否在jvm的常量池中
2018-12-18 17:34 1008public static boolean inPool( ... -
UTC时间, GMT时间 ,夏令时
2017-08-18 15:12 2285经常混淆于此,特地研究了一下,记录在此以备忘。 整个地 ... -
java 反射List
2017-02-18 01:58 5667package com.enhance.reflect; ... -
JDK1.5 Exchange 两个线程互换数据
2016-08-04 18:00 1008import java.util.concurrent ... -
JDK1.5 CountDownLatch
2016-08-04 16:25 1057/* * 还有一个利用场景: ... -
java CyclicBarrier 循环障碍阻塞
2016-08-03 23:54 1014//一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ... -
java 信号灯 Semaphore
2016-08-03 23:53 1828更多介绍http://blog.csdn.net/java20 ... -
java 使用读写锁设计一个缓存模型
2016-08-03 23:49 1420import java.util.HashMap; ... -
java 读写锁
2016-08-03 23:46 820import java.util.Random; i ... -
java 多个线程之间同步通信
2016-08-02 17:16 2402import java.util.concurrent ... -
jdk1.5 锁 Lock 和 Condition
2016-08-02 17:03 927// lock 练习 public class Lock ... -
JDK1.5 获取线程执行结果 Callable Future
2016-08-02 15:08 1176import java.util.Random; i ... -
JDK1.5 线程池
2016-08-02 14:48 806import java.util.concurrent ... -
java 多线程ThreadLocal
2016-08-02 00:13 1150import java.util.Random; ... -
java 定时器 Timer
2016-08-01 16:53 3897import java.util.Calendar; ... -
java 多线程同步+通信
2016-08-01 16:48 970/** *父子线程 交替打印10 次, 100次 ... -
java 线程同步
2016-08-01 16:43 1028import java.util.concurrent.l ... -
java多线程练习
2016-08-01 16:35 1844Java 传统多线程 Java 多线程同步 Java 多线 ... -
java 传统多线程
2016-08-01 16:34 1015/** * 传统多线程 */ public ... -
java 图片,剪切,缩放
2016-01-06 10:21 2235package out; import ja ...
相关推荐
第11天:API类 第12天:字符串王者地位 第13天:算法工具类包装类 第14天:正则及其他类 第15-18天:数组到集合 第19天:文件操作IO 第20、21天:IO流文件操作类图 第22天:其他流 第23天:多线程 第24天:多线程...
《Java编程学习之旅:黑马Java零基础辅导班[第二期]11天课件源码解析》 在Java开发的世界里,扎实的基础是每一位程序员的基石。本篇将围绕"java视频教程_黑马Java零基础辅导班[第二期]11天课件源码"这一主题,深入...
·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...
6. **多线程**:Java对多线程的支持非常强大,你需要学习如何创建和管理线程,理解同步与互斥,以及线程池的概念,这对提升程序性能有很大帮助。 7. **网络编程**:Java的Socket编程能让你构建网络应用程序,理解...
9. **多线程**:理解并发编程的基础,如线程的创建、同步机制(synchronized关键字、wait/notify等)和线程池的使用。 10. **文件和目录操作**:学习如何在Java中创建、读取、修改和删除文件及目录。 11. **网络...
8. **多线程**:Java内置了对多线程的支持,包括线程的创建、同步和通信。 9. **IO与NIO**:Java I/O流系统和新引入的非阻塞IO(NIO)模型,为高性能网络编程提供基础。 10. **异常处理**:学习如何使用try-catch-...
7. **多线程编程**:了解线程的概念,学习Thread类和Runnable接口,掌握同步和异步操作,以及线程间的通信。 8. **JAVA Swing和JavaFX**:学习如何使用JAVA创建图形用户界面(GUI),掌握Swing组件库的使用,或者更...
6. 多线程:Java内置了对多线程的支持,使得开发并发应用变得相对简单。 7. 安全性:Java有严格的安全模型,防止恶意代码对系统造成损害。 在《21天学通Java》这本书中,读者可以接触到以下核心知识点: 1. Java...
6. **多线程**:Java提供了对多线程的支持,理解线程的创建、同步和通信,可以实现高效的并发处理。 7. **反射机制**:反射是Java的一大特色,它允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法。 ...
6. **多线程**:Java内置了对多线程的支持,包括Thread类、Runnable接口,以及同步控制方法(如synchronized关键字、wait()、notify()和notifyAll())。 7. **反射API**:Java反射机制允许在运行时动态地获取类的...
Java支持多线程编程,这使得程序可以同时执行多个任务。学习者将了解线程的概念,如何创建和管理线程,以及如何使用同步机制避免并发问题。 第18-21天:高级话题 这部分可能涵盖反射、泛型、枚举、注解等Java的高级...
多线程编程是Java的一个重要特性,通过实现Runnable接口或继承Thread类创建线程。了解并发控制(synchronized关键字、wait/notify机制)、线程状态以及线程池的概念。 9. **文件与文件系统** 学习File类用于文件...
《21天学通Java》是一本面向初学者的Java编程教材,旨在通过21天的学习计划,让读者快速掌握Java编程基础。20小时的多媒体语音视频教学则为学习者提供了更为直观和生动的学习方式,使理论知识与实践操作相结合,加深...
9. **多线程**:Java内置了对多线程的支持,你可以通过实现Runnable接口或继承Thread类来创建线程。 10. **Swing和JavaFX**:对于图形用户界面(GUI)开发,Java提供了Swing和JavaFX库。这两个库包含了各种组件和...
9. **多线程**:Java内置了对多线程的支持,学习者需要理解线程的创建、同步、生命周期管理等概念。 10. **文件和目录操作**:Java提供了File类来处理文件和目录,包括创建、删除、重命名等操作。 11. **Swing和...
10. **多线程**:Java内置了对多线程的支持,通过实现Runnable接口或继承Thread类来创建线程。了解线程的同步和通信机制,如synchronized关键字、wait()、notify()和notifyAll()方法。 11. **文件和目录操作**:...
11. **多线程**:讲解线程的创建和管理,同步机制(如synchronized关键字和wait/notify机制)以及线程池的使用。 12. **接口与抽象类**:对比接口和抽象类,理解它们在设计中的作用。 13. **反射与注解**:介绍...
11. **多线程**:学习如何创建和管理线程,同步机制(synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 12. **网络编程**:了解套接字(Socket)编程,包括TCP和UDP通信。 13. **Java...
11. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建并管理线程,理解同步和互斥的概念,能够编写并发程序。 12. **异常与日志**:在实际开发中,良好的异常处理和日志记录能帮助定位和...
11. **多线程**:掌握线程的创建与同步,包括Thread类、Runnable接口,以及synchronized关键字、wait()和notify()方法。 12. **IO流和NIO**:了解Java的IO流体系,以及New IO (NIO) 提供的非阻塞I/O操作。 13. **...