码迷,mamicode.com
首页 > 编程语言 > 详细

java 类锁与对象锁(实例锁)同步问题

时间:2017-05-22 21:18:24      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:pre   catch   star   sleep   override   代码   exce   多线程   int   

众所周知,synchronized可修饰方法和代码块,可作用于类或者对象。

当修饰代码块时,synchronized(object) 作用于对象,只约束该对象。

 synchronized(class)作用于类,约束类所有的对象。

修饰方法时,synchronized 修饰static方法时,作用于类。修饰非static方法时作用于对象。

注意类锁和对象锁是两个不同的锁,二者不会发生同步关系。

由于static变量,可被static方法调用,也可被非static方法调用,当二者同时被synchronized修饰时,所以就会出现潜在的同步问题。

所以多线程时静态变量尽量只用静态方法调用,不然就会出现同步混乱。

 

class Test implements Runnable{
    public  static  int num = 0;

    public synchronized void changeNum(){
        num++;
        System.out.println(num);

    }
  
    public synchronized static void addNum(){
        num++;
        System.out.println(num);
    }

    @Override
    public void run() {
        for (int i = 0; i < 2000; i++) {
            changeNum();
            addNum();
            try {
                Thread.sleep(5);
            }catch (InterruptedException ie){

            }
        }
    }
    public static void main(String[] args) {
 
        Test test = new Test();
        Thread t1 = new Thread(test);
        Thread t2 = new Thread(test);
        t1.start();
        t2.start();
    }
}

如果同步,结果应该是8000,然而并不是。

 

java 类锁与对象锁(实例锁)同步问题

标签:pre   catch   star   sleep   override   代码   exce   多线程   int   

原文地址:http://www.cnblogs.com/zqiguoshang/p/6891266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!