黑马程序员技术交流社区

标题: 关于同步代码块和同步函数 [打印本页]

作者: 遗忘的青春年华    时间: 2014-3-15 22:05
标题: 关于同步代码块和同步函数
同步代码块用到的锁是syncheronized,而同步函数用到的是this吗?到底是怎么回事,学过了还是不太清楚这里怎么个实现过程,请详细说明一下,谢谢了
作者: osully    时间: 2014-3-15 22:12
同步代码块
syncheronized()  //括号内可以使用任意对象为锁
{}   
如果在同步函数上,就默认锁为当前对象
如果是静态函数,锁为字节码文件对象(类名.class文件)
作者: 橸瑩膤漃寞林    时间: 2014-3-16 09:42
      
多线程的安全问题:
      
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。
      
解决的办法:
      
对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其它线程不可以参与执行。
      
Java对于多线程的安全问题提供了专业的解决方式,就是同步代码块。
      
synchronized(对象)
      
      
需要被同步的代码
      
      
例子:
synchronized(obj){
      
   if(tick>0){
      
       try {
      
           Thread.sleep(10);
      
       }
       catch (Exception e){}
        System.out.println(Thread.currentThread().getName()+                                "...sale:"+tick--);                                            
      
                        }
      
对象如同锁。持有锁的线程可以在同步中执行,没有锁的线程即使获取CPU的执行权,也进不去,因为没有获取锁。
      
      
同步函数使用的是this锁。
      
函数需要被对象调用,那么函数都有一个所属对象引用,就是this。
      
例子:
      
public  void run(){
      
   this.show();
      
        }
      
        public synchronized void show(){
      
   if(tick > 0){
      
      try{
      
         Thread.sleep(10);
      
      }
      catch(Exception e){}
      
   }
    System.out.println(Thread.currentThread().getName()+
      
"...show....:"+tick--);
      
        }
      
}
      
同步函数被静态修饰后,使用的锁是什么呢?
      
通过验证,发现不再是this,因为静态方法中也不可以定义this。
      
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,类名.class,该对象的类型是Class。
      
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class。
      
例子:
      
class Ticket implements Runnable{
      
    private static int tick = 100;
      
    boolean flag = true;
      
    public  void run(){
      
       if(flag){
      
           while(true){
      
               synchronized(Ticket.class){
      
                   if(tick > 0){
      
                       try{
      
                            Thread.sleep(10);
      
                       }
      
                       catch(Exception e){
           System.out.println(Thread.currentThread().
           getName()+"...code:"+tick--);
      
                                    }
      
                                }
      
                        }
      
                }
      
   else
      
   while(true)
      
      show();
      
        }
      
        public static synchronized void show(){
      
    if(tick > 0){
      
       try{
      
          Thread.sleep(10);
      
       }
      
    catch(Exception e){}
    System.out.println(Thread.currentThread().getName()+     
      
"...show....:"+tick--);
      
                }
      
        }
      
}
   





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2