多线程和并发使用synchronized 让线程按顺序执行

一.先来说说线程为什么执行不按顺序执行

由于在同一个进程内存在多个线程,线程都想占有着稀缺的CPU资源去完成任务和工作(有一部分资源是所有线程共享的),但是cpu资源到底分配谁呢?是这样的,多个线程共同竞争CPU时,存在多种分配策略,但是每种策略下每个线程只是在很短的时间内占有cpu,这段时间就是时间片,到了线程的时间片,就开始执行任务,一旦时间片结束,资源立马被释放,任务也停止,别的线程获得资源,等下一次时间片到来时,再去执行任务。

来看一下测试,创建三个线程分别输出A,B,C:

package com.test.thread;

public class TheadA implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"A");
    }
}
package com.test.thread;

public class TheadB implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"B");
    }
}
package com.test.thread;

public class TheadC implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"C");
    }
}
package com.test.thread;

public class TheadMain {
    private static volatile int num = 10;
    public static void main(String[] args) {
        Thread theadA = new Thread(new TheadA());
        Thread theadB = new Thread(new TheadB());
        Thread theadC = new Thread(new TheadC());
        theadA.start();
        theadB.start();
        theadC.start();
    }
}

执行结果:

第一次执行结果:
Thread-0A
Thread-2C
Thread-1B
第二次执行结果:
Thread-2C
Thread-1B
Thread-0A
第三次执行结果:
Thread-0A
Thread-1B
Thread-2C

很明显执行顺序一直在变化,那么有的场景下我们需要让线程顺序执行,该怎么实现呢?
二,什么是synchronized

Java中synchronized 实现了同步机制,synchronized 可以修饰方法,也可以修饰代码块synchronized (Object)。当方法或者属性被synchronized 修饰时,保证在同一时刻只能有一个线程对其进行操作,有以下规则:

1.另一个线程想要对被synchronized 修饰的属性或者方法必须等当前线程操作完成

2.另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

3.当前线程的其他synchronized 代码块也不可以被其他线程访问

很典型的一个例子就是:比如有一栋大楼只有有一串钥匙,别人得到这串钥匙的话才可以去打开,你必须等别人给你钥匙才可以去打开其中的一个房间,假如你想去501,钥匙在别人手里所以501无法进去,同样没有钥匙,被锁着的502也进不去。

三.synchronized 的好与坏

很明显,被synchronized 修饰后的操作会作为一个整体去完成,也就是保证了原子性

但也正因为一直占用着锁,别的线程想要操作只能一直等待,性能下降

四,实现线程的顺序执行

已创建三个线程不变,在测试类上修改代码即可:

package com.test.thread;

public class TheadMain {
    private static volatile int num = 10;
    public static void main(String[] args) {
        Thread theadA = new Thread(new TheadA());
        Thread theadB = new Thread(new TheadB());
        Thread theadC = new Thread(new TheadC());
        synchronized (theadA) {
        	theadA.start();
		}
        synchronized (theadB) {
        	theadB.start();
        }
        synchronized (theadC) {
        	theadC.start();
        }
    }
}
执行结果:
Thread-0A
Thread-1B
Thread-2C
无论执行多少次,运行的顺序都是一样的

你可能感兴趣的:(java)