JAVA线程中同步锁(synchronized)的使用

时间:2022-12-30 13:02:35

为什么用到同步锁

    在JAVA中CPU总是随机的给每个线程分配时间和资源,许多情况下许多线程用到一样的资源,这样的资源抢占就会遇到一些问题。就像是你为你暗恋的女生在她的生日宴会上买了一个蛋糕,吹完蜡烛之后准备切一块蛋糕给那个女生,谁知道刚吹完蜡烛之后,蛋糕就被别人抢走了,等你抢到时候蛋糕已经分完了,然后你就奔溃了。而同步锁(synchronized)的作用就是把蛋糕和你的手锁在一起,等你把你的心意表达给你的女生之后别人才能拿到这个蛋糕。
public class Runnable_demo implements Runnable{  
private String cake="蛋糕";
public Runnable_demo(){
}
@Override
public void run() {
System.out.println("蜡烛吹灭了"+Thread.currentThread().getName()+"想送女神"+cake);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"送了"+cake);
}

public static void main(String args[]){
Runnable_demo demo=new Runnable_demo();
//你和其他人
new Thread(demo,"你").start();
new Thread(demo,"李明").start();
new Thread(demo,"其他").start();
}

结果呢是这样:
JAVA线程中同步锁(synchronized)的使用

怎么使用同步锁

通过上面的步骤可以看出来,很可能别人先抢了蛋糕分完了,你却白花了这个心思,感觉自己特别冤,那么有什么好办法能够解决这个问题。当然有了,要么你特别牛,别人看见都不敢拿,不过在几分钟之内变壮还是不太现实,最好的办法就是定一个规则:这个蛋糕是我买的,等我把我想干完的事干完了,你们再玩。

  1. 代码块加锁
    “`
    public class Runnable_demo implements Runnable{
    private String cake=”蛋糕”;
    public Runnable_demo(){
    }
    @Override
    public void run() {
    synchronized(this){
    System.out.println(“蜡烛吹灭了”+Thread.currentThread().getName()+”想送女神”+cake);
    try {
    Thread.sleep(30);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+”送了”+cake+”\n”+”蛋糕已经没了”);
    }

        }  

    public static void main(String args[]){
    Runnable_demo demo=new Runnable_demo();
    //基于火车票创建三个窗口
    new Thread(demo,"你").start();
    new Thread(demo,"李明").start();
    new Thread(demo,"其他").start();
    }
结果当然是你想要的结果:
![这里写图片描述](http://img.blog.csdn.net/20170812163124698?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY1MjI2NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

2. 方法加锁

public class Runnable_demo implements Runnable{
private String cake=”蛋糕”;
public Runnable_demo(){
}
@Override
public void run() {
runPre();

        }  
public synchronized void runPre(){
System.out.println("蜡烛吹灭了"+Thread.currentThread().getName()+"想送女神"+cake);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"送了"+cake+"\n"+"蛋糕已经没了");
}
public static void main(String args[]){
Runnable_demo demo=new Runnable_demo();
//基于火车票创建三个窗口
new Thread(demo,"你").start();
new Thread(demo,"李明").start();
new Thread(demo,"其他").start();
}

“`

结果是没有变的,不过为了diamagnetic修改更加便捷,不做让人恨的霸王,最好选择在代码块上加锁。