Java 之多线程的同步处理(Synchronized)

同步处理:
所谓的同步指的是所有的线程不是一起进入到方法中执行,而是按照顺序一个一个来。

synchronized处理同步问题
使用synchronized关键字处理有俩种模式:同步代码块、同步方法。

使用同步代码块必须设置一个要锁定的对象,所以一般可以锁定当前对象this。

eg:

class MyThread implements Runnable{
    private int n = 100;
    @Override
    public void run() {
        for (int i = 0;i < 100;i++){
            //表示在同一时刻只能允许一个线程进入代码块;
            //为程序逻辑上锁
            synchronized (this){
                if (this.n > 0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() +"余量还有"+ this.n--);
                }
            }
        }
    }
}
public class TestDemo  {
    public static void main(String[] args) {
        MyThread mt = new MyThread();
        new Thread(mt,"A").start();
        new Thread(mt,"B").start();
        new Thread(mt,"C").start();
    }
}

这种方式是在方法里拦截的,也就是说进入到方法中的线程依然会有多个。

eg:使用同步方法

class MyThread implements Runnable{
    private int n = 100;
    @Override
    public void run() {
        for (int i = 0;i <100;i--){
            try {
                this.sale();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public synchronized void sale() throws InterruptedException {
        if (this.n > 0){
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + "余量还有:" + this.n--);
        }
    }

}
public class TestDemo  {
    public static void main(String[] args) {
        MyThread mt = new MyThread();
        new Thread(mt,"A").start();
        new Thread(mt,"B").start();
        new Thread(mt,"C").start();
    }
}

实际上,synchronized(this)以及非static的synchronized方法,只能防止多个线程用时执行一个对象的同步代码块,即:synchronized锁住的是对象,而不是代码。

对于非static的synchronized方法,锁住的是对象本身,就是this。

同步虽然可以保证数据的完整性(线程安全操作),但是其执行速度会很慢。

要使用synchronized锁住一段代码,应该锁住多个对象的同一方法,
例如:synchronized(Test.class)
这种锁相当于实现了全局锁的效果,锁的是类,而不是this。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值