• 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();  
        } 
    }

    看打印序列


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


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



  • 相关阅读:
    OpenGL3:先导篇 数据类型
    Linux开发:同步与异步
    前端面试题
    工具
    API和DLL
    CSS了一个浮动导航条
    AJAX背景技术介绍
    2014年8月18日17:02:53
    怎么增加照片的KB大小
    HTML5增加的几个新的标签
  • 原文地址:https://www.cnblogs.com/llguanli/p/8734140.html
Copyright © 2020-2023  润新知