java synchronized锁的对比

synchornized常用的方法的对比。

一 给静态方法和普通方法加锁

加锁的类

public class LockText {

    public synchronized void printCount(){
        int i=0;
        while(i<50){
            System.out.println(Thread.currentThread()+"ynt---"+i);
            i++;
        }
    }

    public synchronized void printString(){
        int i=0;
        while(i<50){
            System.out.println(Thread.currentThread()+"ynt===");
            i++;
        }
    }
    public synchronized static void printChar(){
        char xx=65;
        int i=65;
        while(i<91){
            System.out.println(Thread.currentThread()+"ynt++++"+xx);
            xx++;
            i++;
        }
    }
}

调用类


public class MainText {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        final LockText text=new LockText();
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                    text.printCount();

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                    text.printString();             

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                LockText.printChar();
            }
        }).start();
    }
}

运行结果部分截图

Thread[Thread-0,5,main]ynt---42
Thread[Thread-2,5,main]ynt++++W
Thread[Thread-0,5,main]ynt---43
Thread[Thread-2,5,main]ynt++++X
Thread[Thread-0,5,main]ynt---44
Thread[Thread-2,5,main]ynt++++Y
Thread[Thread-0,5,main]ynt---45
Thread[Thread-2,5,main]ynt++++Z
Thread[Thread-0,5,main]ynt---46
Thread[Thread-0,5,main]ynt---47
Thread[Thread-0,5,main]ynt---48
Thread[Thread-0,5,main]ynt---49
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===

结论:
1.对不同的非静态方法加锁,不能同时访问
2.对静态方法和非静态方法同时加锁,可同时访问

二 对类加锁

加锁类

public class LockText {

    public  void printCount(){
        int i=0;
        while(i<50){
            System.out.println(Thread.currentThread()+"ynt---"+i);
            i++;
        }
    }

    public  void printString(){
        int i=0;
        while(i<50){
            System.out.println(Thread.currentThread()+"ynt===");
            i++;
        }
    }
    public  static void printChar(){
        char xx=65;
        int i=65;
        while(i<91){
            System.out.println(Thread.currentThread()+"ynt++++"+xx);
            xx++;
            i++;
        }
    }
}

调用类

public class MainText {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        final LockText text=new LockText();
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (LockText.class) {
                    text.printCount();

                }

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (LockText.class) {
                    text.printString();             

                }
            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (LockText.class) {
                    LockText.printChar();

                }
            }
        }).start();
    }
}

部分运行结果

Thread[Thread-0,5,main]ynt---45
Thread[Thread-0,5,main]ynt---46
Thread[Thread-0,5,main]ynt---47
Thread[Thread-0,5,main]ynt---48
Thread[Thread-0,5,main]ynt---49
Thread[Thread-2,5,main]ynt++++A
Thread[Thread-2,5,main]ynt++++B
Thread[Thread-2,5,main]ynt++++C
Thread[Thread-2,5,main]ynt++++D
Thread[Thread-2,5,main]ynt++++E
Thread[Thread-2,5,main]ynt++++F
Thread[Thread-2,5,main]ynt++++G
Thread[Thread-2,5,main]ynt++++H
Thread[Thread-2,5,main]ynt++++I
Thread[Thread-2,5,main]ynt++++J
Thread[Thread-2,5,main]ynt++++K
Thread[Thread-2,5,main]ynt++++L
Thread[Thread-2,5,main]ynt++++M
Thread[Thread-2,5,main]ynt++++N
Thread[Thread-2,5,main]ynt++++O
Thread[Thread-2,5,main]ynt++++P
Thread[Thread-2,5,main]ynt++++Q
Thread[Thread-2,5,main]ynt++++R
Thread[Thread-2,5,main]ynt++++S
Thread[Thread-2,5,main]ynt++++T
Thread[Thread-2,5,main]ynt++++U
Thread[Thread-2,5,main]ynt++++V
Thread[Thread-2,5,main]ynt++++W
Thread[Thread-2,5,main]ynt++++X
Thread[Thread-2,5,main]ynt++++Y
Thread[Thread-2,5,main]ynt++++Z
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5

结论
对类加锁静态方法和非静态方法都是同步的

三 对对象加锁

加锁类同二

调用类


public class MainText {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        final LockText text=new LockText();
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (text) {
                    text.printCount();
                }

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (text) {
                    text.printString();             

                }
            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (text) {
                    LockText.printChar();
                }
            }
        }).start();
    }
}

运行结果

运行结果同二

结论:静态方法和非静态方法是同步的

四 简单的 加锁对象加锁类

加锁类同上
public class MainText {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        final LockText text=new LockText();
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (LockText.class) {
                    text.printCount();
                }

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (text) {
                    text.printString();             

                }
            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (text) {
                    LockText.printChar();

                }
            }
        }).start();
    }
}

运行结果

Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---45
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---46
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---47
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---48
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---49
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-2,5,main]ynt++++A
Thread[Thread-2,5,main]ynt++++B
Thread[Thread-2,5,main]ynt++++C
Thread[Thread-2,5,main]ynt++++D
Thread[Thread-2,5,main]ynt++++E
Thread[Thread-2,5,main]ynt++++F
Thread[Thread-2,5,main]ynt++++G
Thread[Thread-2,5,main]ynt++++H
Thread[Thread-2,5,main]ynt++++I

结论 对象锁和类锁不同步

所以对synchronized总结如下:
1.synchronized加到对象上只能锁对象,不同的对象锁不相同因此不同步(代码没贴)
2.synchronized加到类上锁定当前类,静态方法和非静态方法都同步
3.synchronized加到类的不同非静态方法上,方法同步
4.synchronized加到类的静态方法和非静态方法上,他们不同步

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值