zoukankan      html  css  js  c++  java
  • 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();  
        } 
    }

    看打印序列


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


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



  • 相关阅读:
    常见水果的日语单词汇总
    身体各个部位的日语单词
    多拉A梦——日语歌词
    日语——动词的各种变形
    语言类型学分类
    常用自定义函数
    IOS 读取xib里的子控件
    IOS中 copy ,strong ,weak ,assign使用区别
    IOS 字典转模型
    IOS 纯代码添加 Button Image Label 添加到自定义View中
  • 原文地址:https://www.cnblogs.com/llguanli/p/8734140.html
Copyright © 2011-2022 走看看