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

为什么用到同步锁

    在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();  
         }  

结果呢是这样:
这里写图片描述

怎么使用同步锁

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

  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();  
     }     
    
结果当然是你想要的结果:
![这里写图片描述](https://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修改更加便捷,不做让人恨的霸王,最好选择在代码块上加锁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的synchronized关键字是一种用于实现同步的机制。它可以应用于方法和代码块,以确保在同一时刻只有一个线程可以访问共享资源。 以下是一些使用synchronized关键字的案例: 1. 多线程访问共享资源:考虑一个银行账户的例子,多个线程同时尝试改变账户余额。为了避免竞态条件和数据不一致的问题,可以使用synchronized关键字来同步访问共享资源,例如在deposit()和withdraw()方法上使用synchronized。 2. 线程安全的容器:在多线程环境下,使用synchronized可以确保线程安全的访问容器。例如,可以在对ArrayList的增删操作上使用synchronized,以避免多个线程同时修改容器而导致的错误。 3. 生产者-消费者模型:生产者线程负责生成数据,消费者线程负责消费数据。为了保证顺序,可以使用synchronized同步这两个线程。例如,在生产者方法的代码块和消费者方法的代码块上使用synchronized。 4. 对象和类synchronized可以用来实现对象级别的和类级别的。对象级别的是在每个对象实例上加,而类级别的是在类级别上加。例如,在静态方法上使用synchronized即可获得类级别的。 总结来说,synchronized关键字在Java中的使用案例非常广泛,可以用于多线程环境下保证共享资源的安全访问,避免并发操作导致的数据不一致问题。通过使用synchronized,可以有效地控制多个线程对共享资源的访问,确保线程安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值