zoukankan      html  css  js  c++  java
  • synchronized关键字使用剖析

    synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

    主要有两种用法:synchronized方法和synchronized代码块

     

    对于synchronized方法,有如下作用:

    public synchronized void syncCounter(int newVal){
    		System.out.println("synchronized方法...");
    	}

    确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个synchronized方法处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

    synchronized 方法也有它的缺陷
    若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

     

    对于synchronized代码块:

    synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类,eg. this)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

    int i=100,userId=2;
    	String userName="SyncMM";
    	public void methodName(){
    		synchronized(this){
    			i++;
    			System.out.println("Synchronized param i:"+i);
    
    		}
    		System.out.println("userName:"+userName);
    	}
    


     

    未完待续!
    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    Mysql 批量插入数据的方法
    sql server 多行合并一行
    跨服务器多库多表查询
    OPENQUERY用法以及使用需要注意的地方
    C# 判断操作系统的位数
    rpc介绍
    JavaScript decodeURI()与decodeURIComponent() 使用与区别
    UNIX 时间戳 C#
    C# winform javascript 互调用
    oracle 实例名和服务名以及数据库名区别
  • 原文地址:https://www.cnblogs.com/iplus/p/4464724.html
Copyright © 2011-2022 走看看