A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姬光普 中级黑马   /  2015-5-20 23:47  /  304 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了视频后,对同步安全锁的验证,这是老师视频上举得例子
1.同步代码块中的锁就是一个简单的对象,很具有随意性
代码:
  1. class Test implements Runnable
  2. {
  3.         private int tick = 100;
  4.         Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while(tick > 0)
  8.                 {
  9.                         synchronized(obj)
  10.                         {
  11.                                 if(tick > 0)
  12.                                 {
  13.                                         try
  14.                                         {
  15.                                                 Thread.sleep(1);
  16.                                         }
  17.                                         catch(Exception e)
  18.                                         {

  19.                                         }
  20.                                         System.out.println(Thread.currentThread().getName()+"...sale..."+tick--);
  21.                                 }
  22.                         }
  23.                 }
  24.         }
  25. }

  26. public class Test1
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.                 Test t = new Test();
  31.                 Thread d1 = new Thread(t);
  32.                 Thread d2 = new Thread(t);
  33.                 Thread d3 = new Thread(t);
  34.                 Thread d4 = new Thread(t);
  35.                 d1.start();
  36.                 d2.start();
  37.                 d3.start();
  38.                 d4.start();
  39.         }
  40. }
复制代码
2.同步函数中的锁是this,下面代码中
代码:
  1. package org.heima1;
  2. public class Test2 {
  3.         /**
  4.          * 验证同步函数的锁是不是this,利用同步代码块和同步函数两种方式同步进行。如果是this,则遵从了同步的前提:必须是多个线程使用同一个锁,不会输出0
  5.          */
  6.         public static void main(String[] args) {
  7.                 Tickets t=new Tickets();
  8.                 Thread t1=new Thread(t);
  9.                 Thread t2=new Thread(t);
  10.                 t1.start();
  11.                 try {
  12.                         Thread.sleep(10);//停一下主线程
  13.                 } catch (InterruptedException e) {
  14.                         e.printStackTrace();
  15.                 }
  16.                 t.flag=false;
  17.                 t2.start();
  18.         }
  19. }
  20. class Tickets implements Runnable{
  21.         private int num=1000;//总共1000张票
  22.         Object obj=new Object();
  23.         Boolean flag=true;
  24.         public void run(){
  25.                 if(flag){
  26.                         while(true){
  27.                                 //synchronized(obj){//如果用obj则两个线程不是共用一个锁,产生安全问题,直接导致输出0
  28.                                 synchronized(this){//如果用this锁,则没有输出0,表示两者用的是同一个锁
  29.                                         if(num>0){
  30.                                                 try{
  31.                                                         Thread.sleep(10);
  32.                                                 }catch(Exception e){
  33.                                                 }
  34.                                                 System.out.println(Thread.currentThread().getName()+"---代码块----第"+num--);
  35.                                         }
  36.                                 }
  37.                                
  38.                         }               
  39.                 }
  40.                 else {
  41.                         while(true)
  42.                                 show();
  43.                 }
  44.         }
  45.         public synchronized void show(){  //同步函数
  46.                 if(num>0){
  47.                         try{
  48.                                 Thread.sleep(10);
  49.                         }catch(Exception e){
  50.                         }
  51.                         System.out.println(Thread.currentThread().getName()+"----同步函数----第"+num--);
  52.                 }
  53.         }
  54. }
复制代码
3.静态同步函数使用的锁是该方法所在类的字节码对象,也就是类名.class
代码示例:
  1. public class Test3 {

  2.         /**
  3.          * 验证静态同步函数的锁是不是所在类的字节码对象,利用同步代码块和同步函数两种方式同步进行。
  4.          */
  5.         public static void main(String[] args) {
  6.                 Tickets2 t=new Tickets2();
  7.                 Thread t1=new Thread(t);
  8.                 Thread t2=new Thread(t);
  9.                 t1.start();
  10.                 try {
  11.                         Thread.sleep(10);//停一下主线程
  12.                 } catch (InterruptedException e) {
  13.                         e.printStackTrace();
  14.                 }
  15.                 t.flag=false;
  16.                 t2.start();

  17.         }

  18. }
  19. class Tickets2 implements Runnable{
  20.         private static int num=100;//总共1000张票
  21.         Object obj=new Object();
  22.         Boolean flag=true;
  23.        
  24.         public void run(){
  25.                 if(flag){
  26.                         while(true){
  27.                                 //synchronized(obj){//如果用obj则两个线程不是共用一个锁,产生安全问题,直接导致输出0
  28.                                 //synchronized(this){//如果用this则两个线程不是共用一个锁,产生安全问题,直接导致输出0
  29.                                 synchronized(Tickets2.class){//如果用Tickets2.class锁,则没有输出0,表示两者用的是同一个锁
  30.                                         if(num>0){
  31.                                                 try{
  32.                                                         Thread.sleep(10);
  33.                                                 }catch(Exception e){
  34.                                                 }
  35.                                                 System.out.println(Thread.currentThread().getName()+"---代码块----第"+num--);
  36.                                         }
  37.                                 }
  38.                                
  39.                         }               
  40.                 }
  41.                 else {
  42.                         while(true)
  43.                                 show();
  44.                 }
  45.         }
  46.         public static synchronized void show(){  //同步函数
  47.                 if(num>0){
  48.                         try{
  49.                                 Thread.sleep(10);
  50.                         }catch(Exception e){
  51.                         }
  52.                         System.out.println(Thread.currentThread().getName()+"----同步函数----第"+num--);
  53.                 }
  54.         }
  55. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马