• java线程同步方法,方法块差别


    先说同步方法。它究竟是锁定的当前对象,还是当前类

    代码块1

    package com.ssss;
    
    public class Thread1 implements Runnable {  
    	//public static Object  o=new Object();
    
        public void run() {
        	pt();
        }
        
        public synchronized void pt(){
        	int a=0;
            //synchronized(o) {  
                 for (int i = 0; i < 5; i++) {
               	  a++;
               	  try {
    					Thread.sleep(1000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
                      System.out.println(Thread.currentThread().getName() + " synchronized loop " + i + "++++" + a);  
                 }  
            //}  
        }
        
        
        public static void main(String[] args) {  
             Thread1 t1 = new Thread1();  
             Thread1 t2 = new Thread1();  
    
             Thread ta = new Thread(t1, "A");  
             Thread tb = new Thread(t2, "B");  
             ta.start();  
             tb.start();  
        } 
    }

    打印出来的结果为


    由此可见是当前对象,而A和B是两个不同的对象。所以打印序列就是混乱的


    代码块2

    看同步块

    package com.ssss;
    
    public class Thread1 implements Runnable {  
    	public static Object  o=new Object();
    
        public void run() {
        	pt();
        }
        
        public void pt(){
        	int a=0;
            synchronized(o) {  
                 for (int i = 0; i < 5; i++) {
               	  a++;
               	  try {
    					Thread.sleep(1000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
                      System.out.println(Thread.currentThread().getName() + " synchronized loop " + i + "++++" + a);  
                 }  
            }  
        }
        
        
        public static void main(String[] args) {  
             Thread1 t1 = new Thread1();  
             Thread1 t2 = new Thread1();  
    
             Thread ta = new Thread(t1, "A");  
             Thread tb = new Thread(t2, "B");  
             ta.start();  
             tb.start();  
        } 
    }

    看打印序列


    说明同步块能够锁定不论什么对象


    就是说同步方法是锁定当前对象,同步方法块是能够锁定不论什么对象



  • 相关阅读:
    最好的我们
    外滩
    外滩
    Java EE (5) -- Java EE 6 JavaServer Faces Developer Certified Expert(1z0-896)
    列表list(序列)、元组tuple(序列)
    P1165 日志分析 洛谷
    T1365 浴火银河星际跳跃 codevs
    T1503 愚蠢的宠物 codevs
    P2820 局域网 洛谷
    T1992 聚会 codevs
  • 原文地址:https://www.cnblogs.com/llguanli/p/8734140.html
Copyright © 2020-2023  润新知