同步静态方法与同步非静态方法
来源:互联网 发布:中国美国商会 知乎 编辑:程序博客网 时间:2024/05/21 09:59
可参考
http://blog.sina.com.cn/s/blog_870def820102vshl.html
同步方法:
1):同步静态方法:某个类Object中的某个静态方法staticMethod加上同步锁之后,当某个线程Thread调用staticMethod时该线程会获取Object类的锁(当前Object的锁没被其它线程获取时,若当前Object锁被其它锁获取则会进行等待。),此时其他任何线程在Thread释放锁前都无法调用Object类中任何的同步静态方法。
2):同步非静态方法:某个类Object中的某个非静态方法Method加上同步锁之后,当某个线程Thread调用Method时会获取所对应的Object对象的锁,此时其他线程在Thread释放锁前都无法调用改对象中的任何同步非静态方法(所有非静态同步方法都共用其所属的对象的锁)
3):两者区别:
前提:Object 中包含静态同步方法staticMethod01,staticMethod02 , 非静态同步方法Method01 , Method02,线程Thread1 和 Thread2:
Object obj1 = new Object();
Object obj2 = new Object();
**a.当Thread1调用obj1.Method01()时,若Thread2想调用obj1.Method01()或者obj1.Method01()都需要先等待obj1.Method01()执行完释放锁才能进行调用。
b.当Thread1调用obj1.Method01()时,Thread2可以不用等待Thread01释放锁即可调用obj2.Method01()或者 obj2.Method02();**
因为非静态同步方法的锁是相对于对象而言。
c.当Thread1 调用obj1.staticMethod01()时,Thread2不管是调用obj1.staticMe01()还是obj2.staticMethod01()都需要等待Thread1释放锁后才能进行调用。
因为静态同步方法的锁是相对于类而言
public class Count { public static int count = 0; //同步的静态方法 public synchronized static void addCountS() { count++; } //同步的非静态方法 public synchronized void addCount() { count++; } @Override public String toString() { return "Count =" + count; }}public class Test { public static void main(String[] args) { for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { Count count = new Count(); //同步静态方法时,结果总是1000 // Count.addCountS(); //而同步非静态方法时,结果却不一定,这是因为这里同步的是非静态方法,持有锁的是调用该方法的对象,而这个run方法每次会new一个count实例,所以每次是不同的锁。 count.addCount(); System.out.println(count); } }).start(); } }}
- 静态同步方法与非静态同步方法的区别
- 同步静态方法与同步非静态方法
- 同步方法(非静态)
- java synchronized静态同步方法与非静态同步方法,同步语句块
- java synchronized静态同步方法与非静态同步方法,同步语句块
- java synchronized静态同步方法与非静态同步方法,同步语句块
- java synchronized静态同步方法与非静态同步方法,同步语句块
- synchronized静态同步方法与非静态同步方法,同步语句块
- java synchronized静态同步方法与非静态同步方法,同步语句块
- java synchronized静态同步方法与非静态同步方法,同步语句块
- synchronized 同步方法中静态与非静态的区别
- java synchronized同步静态方法和同步非静态方法的区别与举例
- java synchronized同步静态方法和同步非静态方法的区别与举例
- 同步代码块,同步方法,同步静态方法,同步非静态方法的区别
- Synchronized同步静态方法和非静态方法总结
- Synchronized同步静态方法和非静态方法
- java同步静态方法与非静态方法(使用synchronized关键字)
- JAVA静态方法同步
- Web开发三层架构
- ♥HDOJ 2050-折线分割平面【几何图形+公式推理】
- 快速新建class、新建Package、新建Xml文件的方式
- 【Seagate】希捷12代盘状态忙的修复流程
- Apache Tomcat Web集群
- 同步静态方法与同步非静态方法
- Linux下mongodb的安装
- Java中的文件操作和对象的序列化
- 用递归算法实现斐波那契数列显示(Java)
- Android cardview 去掉圆角和去掉背景
- git设置用户名密码
- 背包问题 — — NYOJ 860 又见01背包
- 【LeetCode从零单排(Java)】No1.Two Sum
- 51Nod 1003 阶乘后面0的数量