小弟自学党一枚,这两天在学习线程的内容,写点东西检验下学习效果吧!一来对自己学过的内容做下巩固,二来要是可以给同在学习的xdjm哪怕一丢丢的借鉴和启发,想必也是极好的。欢迎小伙伴积极拍砖,踊跃发言,废话不多说,上demo程序!
class ThreadDemo {
public static void main(String[] args) {
TestThread t = new TestThread();
new Thread(t).start();
try{Thread.sleep(9);} catch(Exception e) {}
t.s = new String("method");
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread implements Runnable //extends Thread
{ String s = new String(""); //监视器对象,保证监视器对象的唯一性
int tickets = 100;
public void run() {
if(s.equals("method")) {
while(true) {
sale();
}
} else {
while(true) {
synchronized(this) {
/*使用此方法时须传入任意一个对象,当某个线程进入同步代码块(synchronized()里的代码)
执行的时候,该对象的标志位(锁旗标)将被设为0,会引起其他线程阻塞,执行完之后同步
代码块后,锁旗标将被重置为1,等待线程的其中一个方可进入代码块中执行,这样就保证了
代码块中永远只有一个线程在执行,保证了代码执行的原子性
*/
if(tickets>0) {
try{
Thread.sleep(10);//线程休眠
System.out.println(Thread.currentThread().getName()+" tickets is saling "+tickets--);
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
}
public synchronized void sale() { //同步函数
if(tickets>0) {
try{
Thread.sleep(10);//线程休眠
System.out.print("sale(): ");
System.out.println(Thread.currentThread().getName()+" tickets is saling "+tickets--);
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
写代码一个宗旨就是务必保证代码要严谨,如果事前不考虑周到,后续可能会出现各种各样的bug,那时候可就悲剧了,得不偿失啊!线程同步在这儿就实现了这个目的,当然,在可以确保线程是安全的情况下,可以不适用同步,线程同步是以牺牲程序性能为前提进行的,因为cpu分配线程的时候要检查其是否阻塞,要花费较多的资源和时间。如以上代码所示,线程同步可以使用三种方法:1、同步代码块(synchronized()里的代码);2、同步方法;3、二者结合起来。上面是一个出售100张票的程序,使用四个线程同时出售这100张票,也就是使用多个相同程序的线程处理同一资源对象,个人觉得,在使用线程的时候去实现Runnable接口远比继承thread类要更加灵活(比如解决了Java单继承所带来的局限性,这里就不多加赘述了),貌似大部分时候也是这样做的。所谓线程同步,其工作的核心机理就是若干个线程使用同一监视器对象,即保证监视器对象的唯一性。好了,就写到这里,不到之处,还望指出,O(∩_∩)O谢谢~~~