您的位置:首页 > 编程语言 > Java开发

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{}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程