同步代码块与同步函数交替执行
排除安全隐患。
package hr.csdn.com;
/*
1 让同步函数 和同步代码块交替执行
2 只有同步函数和同步代码块使用相同的锁 才能实现同步。
3 验证同步函数使用的是this锁
*/
public class Syno {
public static void main(String args[]){
Test a=new Test();
Thread t1=new Thread(a);
Thread t2=new Thread(a);
t1.start();//开启一个线程以后,让main线程休息10毫秒
try{
Thread.sleep(10);
}
catch(Exception e){
e.printStackTrace();
}
a.str="abc";//设置字符串为abc ,让它执行同步函数以达到交替执行的目地
t2.start();
}
}
class Test implements Runnable{
private int tickets=100;
String str=new String("");//任何一个对象都可以成为一个锁 比如Object obj=new Object();
//在这里我用String对象作为标记
public synchronized void action(){//这个同步函数的锁是this 也就是本类的对象,这是为了 与同步代码块实现同步,排除安全隐患
while(true){
if(tickets>0){
try{
Thread.sleep(20);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"同步函数卖票"+tickets--);
}
}
}
public void run(){
while(true){
if(str.equals("abc")){
action();
}else{
while(true){
show();
}
}
}
}
private void show() {
// TODO Auto-generated method stub
while(true){
synchronized(this){//若是这里的用String对象作为锁,就会出现安全隐患
if(tickets>0){
try{
Thread.sleep(20);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"同步代码块卖票"+tickets--);
}
}
}
}
}