synchronized与static synchronized
来源:互联网 发布:ewb电路仿真软件 编辑:程序博客网 时间:2024/06/07 10:24
概述
我们可能对synchronized了解,对static也不陌生(Java static关键字),但是对两者的结合 static synchronized可能不太了解。在一些面试中,会问及synchronized与static synchronized的区别
区别
synchronized关键字
synchronized作用是对类的当前实例(对象)加锁。可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁(Java 并发编程)。
synchronized代码块【synchronized(synObject)】使用起来比synchronized方法要灵活得多。因为也许一个方法中只有一部分代码只需要同步,如果此时对整个方法用synchronized进行同步,会影响程序执行效率。而使用synchronized代码块就可以避免这个问题(同步对象或类属性),synchronized代码块可以实现只对需要同步的地方进行同步。
与Lock的区别:1. synchronized是Java语言的关键字,因此是内置特性,Lock是一个类(java.util.concurrent.locks包),通过这个类可以实现同步访问;2. synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用。Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
static synchronized:
每个类有一个锁,它可以用来控制对static数据成员的并发访问。访问static synchronized方法占用的是类锁,而访问非static synchronized方法占用的是对象锁。
static synchronized控制类的所有实例(对象)的访问(相应代码块)。synchronized相当于 this.synchronized,static synchronized相当于Something.synchronized
代码解析:
package com.xianggen.concurrent;/** * static synchronized 和synchronized的区别! * 关键是区别第四种情况! * @author xianggen * @2016年9月3日 上午11:49:39 */public class StaticSynchronized { /** * synchronized方法 */ public synchronized void isSynA(){ System.out.println("isSynA"); } public synchronized void isSynB(){ System.out.println("isSynB"); } /** * static synchronized方法 */ public static synchronized void cSynA(){ System.out.println("cSynA"); } public static synchronized void cSynB(){ System.out.println("cSynB"); } public static void main(String[] args) { StaticSynchronized x=new StaticSynchronized(); StaticSynchronized y=new StaticSynchronized(); /** * x.isSynA()与x.isSynB() :不能同时访问(同一个对象访问synchronized方法) * x.isSynA()与y.isSynB() :能同时访问(不同对象访问synchronized方法) * x.cSynA()与y.cSynB() :不能同时访问(不同对象也不能访问static synchronized方法) * x.isSynA()与y.cSynA() :能同时访问(static synchronized方法占用的是类锁,而访问synchronized方法占用的是对象锁,不存在互斥现象) */ }}
- synchronized与static synchronized
- synchronized与static synchronized
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- Java synchronized与static synchronized 的区别
- synchronized与static synchronized 的区别
- Unity3D —— Socket通信(C#)
- Linux分页机制之分页机制的演变--Linux内存管理(七)
- Android下bluedroid、bluetooth apk介绍
- 深度卷积神经网络.cnn权值网络与cnn权值矩阵的创新思路
- [完]Python,解决Matplotlib制图时的中文问题
- synchronized与static synchronized
- nyoj36 最长公共子序列 【DP(二维)】
- Activity的过渡动画
- aidl
- TreeSet中类实现compareTo以及内部类中实现compareTo
- Day25、malloc 内存分配、mmap内存映射、文件的操作(文件描述符、open\close\read)
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads (树形dp,lca)★ ★ ★
- banner字体
- UVA-10780-Again Prime? No Time(素数分解)