Java Thread 锁Synchronized (一)

风流意气都作罢 提交于 2020-03-01 03:46:06

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方法,直接该对象把锁释放掉,其它线程才可以访问

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!