Java Thread 锁Synchronized (一)

Java线程中如果给方法加锁,有一些陷井。下面用些例子进行详解

先构建一个Task类有两个执行方法

class Task {
    public void excute1(String threadName) {
        for (int i = 0; i <= 20; i++) {
            System.out.println(threadName + " ------ " + i);
        }
    }
    public void excute2(String threadName){
        for (int i = 0; i <= 20; i++) {
            System.out.println(threadName + " ------ " + i);
        }
    }
}

两个线程来分别调用Task中的excute1,excute2方法

ThreadA

class ThreadA extends Thread {
    private Task task;
    public ThreadA(Task task) {
        this.task = task;
    }
    @Override
    public void run() {
        task.excute1(this.getName());
    }
}

ThreadB

class ThreadB extends Thread {
    private Task task;
    public ThreadB(Task task) {
        this.task = task;
    }
    @Override
    public void run() {
        task.excute2(this.getName());
    }
}

用一个测试类进行测试

public class SychronizeTest {
    public static void main(String[] args) {
        Task t = new Task();
        ThreadA ta = new ThreadA(t);
        ThreadB tb = new ThreadB(t);
        ta.start();
        tb.start();
    }
}

这时候测试,代码执行结果会两个线程错乱。。。,如果想有序执行,就需要加入Sychronized 关键字到excute1 和 excute2上。

class Task {
    public synchronized void excute1(String threadName) {
        for (int i = 0; i <= 20; i++) {
            System.out.println(threadName + " ------ " + i);
        }
    }
    public synchronized  void excute2(String threadName){
        for (int i = 0; i <= 20; i++) {
            System.out.println(threadName + " ------ " + i);
        }
    }
}

虽说两个线程执行不同的方法,但是结果还是会有序的执行,原因是当访问某个对象的Synchronized方法时,表示将对该对象上锁,此时其它任何线程都无法访问该对象下的synchronized方法,直接该对象把锁释放掉,其它线程才可以访问

转载于:https://my.oschina.net/u/1273644/blog/800330

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值