synchronized关键字

synchronized作用<摘抄>:

Synchronzied关键字的作用一个词概括就是:线程同步。它可以用来修改对象中的方法,将对象加锁。相当于不管哪一个线程(例如:A)运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行。

文章来源:https://www.cnblogs.com/oracleDBA/archive/2010/05/22/1741642.html(有改动).

错误代码:

 

public class Test_02
{
    public static void main(String[] args)
    {
        TestDome1 t4=new TestDome1();

        new Thread(t4,"线程一").start();
        new Thread(t4,"线程二").start();

    }
}

class TestDome1 implements Runnable
{
    private int num=100;
    public synchronized void run()
    {
        while (true)
        {
            if (num > 0)
            {
                System.out.println(Thread.currentThread().getName() + "正在出售第" + num-- + "张票...");
            }
            else
            {break;}
        }
    }
}
  1. 创建了一个TestDome1的实例,引用为t4
  2. 创建了两个匿名线程,在传参时写了t4,并命名为<线程一,线程二>,然后开启线程。
  3. 开启线程后两个线程执行run()方法,可是run方法被synchronized修饰,然后假如线程一先抢到了cpu的执行权,所以线程一先进入run方法,然后this锁标志位变成0,而线程二获得执行权后,并不能进入run方法,所以线程二一直在处于阻塞状态。

关于一个线程死执行:

当线程一进入run方法后,便进入到了while循环,此时while是一个死循环,进入后便开始判断(if代码块),如若num(10)>0,便执行System.out.println(Thread.currentThread().getName() + "正在出售第" + num-- + "张票...");由于run方法被同步监视器修饰,又由于while是个死循环,所以一直是线程一执行,当执行完后,if判断代码则不成立了(num值为0了,如果轮到线程二执行,那么它也执行不到什么内容),所以执行break;语句,跳出循环,此时进程就结束了。

发表评论 / Comment

用心评论~