Java 线程同步方式

Java中synchronized关键字锁定的是对象。验证代码如下:

class Demo
{
    public synchronized void  sayHello(){
        try{
            System.out.println("hello start");
            Thread.sleep(100);
            System.out.println("hello end");
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public synchronized void doAction()
    {
        try{
            System.out.println("put up hand");
            Thread.sleep(100);
            System.out.println("put down hand");
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

public class Test {
    public static void main(String[] args)
    {
        Demo demo = new Demo();
        Demo demoA = new Demo();
        Thread sayThread = new Thread(new Runnable() {
            @Override
            public void run() {
                demo.sayHello();
            }
        });

        Thread actionThread = new Thread(new Runnable() {
            @Override
            public void run() {
//                demo.doAction();
                demoA.doAction();
            }
        });

        sayThread.start();
        actionThread.start();
    }
}

三种情况:

1、两个线程都使用demo变量,方法用synchronized修饰。 结果: sayHello和doAction一定是一个执行完另一个才执行。

2,两个线程都使用demo变量,方法不使用synchronized修饰。结果:sayHello和doAction可以交叉执行。

3、两个线程分别使用demo和demoA变量,方法用synchronized修饰。 结果: sayHello和doAction可以交叉执行。

Semaphore 用法:

import java.util.concurrent.Semaphore;

class PreTask implements Runnable
{
    private Semaphore sem;
    private int weight;
    PreTask(Semaphore sem, int weight){
        this.sem = sem;
        this.weight = weight;
    }
    public void run()
    {
        try{
            System.out.println("a pretask starts");
            Thread.sleep(100);
            System.out.println("a pretask is done which weight is "+this.weight);
            this.sem.release(this.weight);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

class LateTask implements Runnable
{
    private Semaphore sem;
    private int requireWeight;
    LateTask(Semaphore sem, int requireWeight)
    {
        this.sem = sem;
        this.requireWeight = requireWeight;
    }
    public void run()
    {
        try{
            this.sem.acquire(this.requireWeight);
            System.out.println("a latetask starts");
            Thread.sleep(100);
            System.out.println("a latetask is done which requireWeight is "+this.requireWeight);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
public class Test {
    public static void main(String[] args)
    {
        Semaphore semaphore = new Semaphore(0);
        PreTask preA = new PreTask(semaphore, 1);
        PreTask preB = new PreTask(semaphore, 3);
        LateTask late = new LateTask(semaphore, 4);

        Thread preThreadA = new Thread(preA);
        Thread preThreadB = new Thread(preB);
        Thread lateThreadB = new Thread(late);

        preThreadA.start();
        preThreadB.start();
        lateThreadB.start();
    }
}

 输出结果如下:

a pretask starts
a pretask starts
a pretask is done which weight is 3
a pretask is done which weight is 1
a latetask starts
a latetask is done which requireWeight is 4

import java.util.concurrent.Semaphore;

class User implements Runnable
{
    private Semaphore sem;
    private String name;
    User(Semaphore sem, String name){
        this.sem = sem;
        this.name = name;
    }
    public void run()
    {
        try{
            this.sem.acquire(1);
            System.out.println(this.name+" take up a pen");
            Thread.sleep(100);
            System.out.println(this.name+" put down a pen ");
            this.sem.release(1);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}


public class Test {
    public static void main(String[] args)
    {
        Semaphore penSet = new Semaphore(2);

        User zhangsan = new User(penSet, "zhangsan");
        User lisi = new User(penSet, "lisi");
        User wangwu = new User(penSet, "wangwu");
        User zhaoliu = new User(penSet, "zhaoliu");

        Thread threadZhangsan = new Thread(zhangsan);
        Thread threadL = new Thread(lisi);
        Thread threadW = new Thread(wangwu);
        Thread threadZhaoliu = new Thread(zhaoliu);

        threadZhangsan.start();
        threadL.start();
        threadW.start();
        threadZhaoliu.start();
    }
}

 结果:最多同时有两个人在使用铅笔

猜你喜欢

转载自www.cnblogs.com/afraidToForget/p/10117340.html