JAVA基础多线程的安全问题
2018-03-07 08:36
267 查看
package com.thread; /* * 线程安全问题: * 在多线程环境中有多条语句操作共享数据时。 * 解决方案: * 用同一把锁把可能有安全问题的代码锁起来 * 一共两种解决线程安全的方式: * 1.同步代码块: * 同步代码块,一定有一个同步对象可以是任意对象,既然谁都可以,就用this * 格式: * synchronized(同步锁对象){操作共享数据的代码 } * 2.同步方法 * 把synchronized加在方法上。同步方法的锁对象是所以方法都具有的隐式对象,当前类的实例this * 注意:如果用继承Thread的方式实现线程,那么同步对象不能用this。 * 特殊情况:静态方法 * 静态方法优先于对象实例存在,所以不可能是this,因为加载静态方法时,对象还未实例化,不存在this。但是锁对象必须 * 有,怎么办?那么不管代码怎么写,都必须加载.class字节码文件。Java中一切皆对象,这个字节码文件也是一个对象,即Class * 对象,静态方法同步方法的锁对象就是Class对象。 * Class clazz =Synchronized.class; * * 线程通信: * public final void wait():阻塞方法(相当于放音乐的暂停键,从哪停,从哪释放),调用wait后线程等待,释放锁,直到其 * 他线程调用notify方法唤醒,唤醒后从等待的地方继续执行。 * * */ public class SaleTickets implements Runnable{ private int tickets =50; Any any= new Any(); public void run(){ /*while(tickets>0){ System.out.println(Thread.currentThread().getName()+"==="+tickets--); try{ Thread.sleep(100l); }catch (Exception e) { e.printStackTrace(); } }*/ while(true){ //this当前对象,同步代码块,一定有一个同步对象,同步不能保证当前线程一人执行一次 // System.out.println(this.toString()); synchronized(this){ if(tickets>=0) break; System.out.println(Thread.currentThread().getName()+"==="+tickets--); } try{ Thread.sleep(10l); }catch (Exception e) { e.printStackTrace(); } } } class Any{} }
相关文章推荐
- java基础-多线程的安全问题
- Java基础-多线程-②多线程安全问题
- java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
- 黑马程序员——JAVA基础之多线程的安全问题
- Java基础——多线程的安全问题
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- Java基础-多线程-②多线程安全问题
- 【黑马程序员】Java基础05:多线程与其安全问题
- java基础—多线程下的单例设计模式的安全问题
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
- java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 黑马程序员--Java基础--多线程安全问题
- 黑马程序员:Java基础——多线程之安全问题与同步
- 黑马程序员_java多线程安全问题
- 黑马程序员--JAVA基础复习之多线程(二)线程安全与解决方法
- java 多线程(线程间通信-解决安全问题)
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- 黑马程序员--Java 多线程的安全问题
- 黑马程序员-JAVA基础-多线程的安全、同步与死锁