java中synchronized关键字的简单使用

synchronized是java中的关键字,可以保证程序执行时,只有一个线程可以访问被加锁的代码。

有如下3种使用方式:

  • 修饰一个代码块,锁为自定义的对象;
  • 修饰一个实例方法,锁为当前对象,即this所指向的对象;
  • 修饰一个静态方法,锁为当前类的class对象。

 

一、不加锁

public class Test03 {

    public static void main(String[] args) {
        Runnable runnable = () -> {
            String name = Thread.currentThread().getName();

            System.out.println(name + ":开始");

            for (int i = 0; i < 5; i++) {
                System.out.println(name + ":" + i);
            }

            System.out.println(name + ":结束");
        };

        Thread t1 = new Thread(runnable, "thread-1");
        Thread t2 = new Thread(runnable, "thread-2");

        t1.start();
        t2.start();
    }
        
}

执行结果

 

 二、修饰一个代码块

public class Test03 {

    public static void main(String[] args) {
        String s = "s";

        Runnable runnable = () -> {
            String name = Thread.currentThread().getName();

            synchronized (s) {
                System.out.println(name + ":开始");

                for (int i = 0; i < 5; i++) {
                    System.out.println(name + ":" + i);
                }

                System.out.println(name + ":结束");
            }
        };

        Thread t1 = new Thread(runnable, "thread-1");
        Thread t2 = new Thread(runnable, "thread-2");

        t1.start();
        t2.start();
    }
        
}

执行结果

三、修饰一个实例方法

public class Test03 {

    public static void main(String[] args) {

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                method(name);
            }

            public synchronized void method(String name) {
                System.out.println(name + ":开始");

                for (int i = 0; i < 5; i++) {
                    System.out.println(name + ":" + i);
                }

                System.out.println(name + ":结束");
            }
        };

        Thread t1 = new Thread(runnable, "thread-1");
        Thread t2 = new Thread(runnable, "thread-2");

        t1.start();
        t2.start();
    }
        
}

执行结果

四、修饰一个静态方法

public class TestSync implements Runnable {

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        TestSync.method(name);
    }

    public synchronized static void method(String name) {
        System.out.println(name + ":开始");

        for (int i = 0; i < 5; i++) {
            System.out.println(name + ":" + i);
        }

        System.out.println(name + ":结束");
    }
}
public class Test03 {

    public static void main(String[] args) {

        TestSync testSync = new TestSync();

        Thread t1 = new Thread(testSync, "thread-1");
        Thread t2 = new Thread(testSync, "thread-2");

        t1.start();
        t2.start();
    }
        
}

五、总结

在java编程中使用synchronized关键字可对代码加锁,有三种使用方式:修饰代码块、修饰实例方法、修饰静态方法。

锁是一个对象,修饰代码块时锁为自定义的对象,修饰实例方法时锁为调用该方法的实例,修饰静态方法时锁就是该类的class对象。

有的博客说有synchronized还可以修饰类,只不过是修饰代码块时锁定义为一个class对象,仍然是修饰代码块。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值