关于线程同步的一点总结

来源:互联网 发布:奇秀软件下载 编辑:程序博客网 时间:2024/05/18 00:36

        小弟自学党一枚,这两天在学习线程的内容,写点东西检验下学习效果吧!一来对自己学过的内容做下巩固,二来要是可以给同在学习的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谢谢~~~

0 0
原创粉丝点击