多线程(四)多线程的同步机制

为了避免在同一时刻对同一个资源有多个线程访问造成的不可预知问题, 所以采用线程的同步机制

–代码中的同步机制

  • –synchronized(同步锁)关键字的作用就是利用一个特定的对象设置一个锁lock, 在多线程并发访问的时候, 同事只允许一个线程, 可以获得这个锁, 执行特定的代码, 执行之后释放锁, 继续有其他线程争抢

–Synchronize的使用场景

  • –synchronized代码块 - 任意对象即可
  • –synchronized方法 - this当前对象
  • –synchronized静态方法 - 该类的字节码对象

–示例代码

package com.ygq.thread;

import java.util.Random;

/**
 * @author :GQ.Yin
 * @date :Created in 2019/7/19 17:39
 * @description:多线程的同步机制
 * @version: $version$
 */
public class SyncSample {
    public static void main(String[] args) {
        final Couplet c = new Couplet();
        for (int i = 0; i < 10000; i++) {
            new Thread(){
                @Override
                public void run() {
                    int r = new Random().nextInt(2);
                    if (r%2 == 0){
                        c.first();
                    }else{
                        c.second();
                    }
                }
            }.start();
        }
    }
}


class Couplet {
    /**synchronized同步代码块示例*/
    Object lock = new Object(); //锁对象
    public void first() {
        synchronized (lock){ //同步代码块, 在同一时刻, 只允许有一个线程执行这个方法
            System.out.printf("琴");
            System.out.printf("瑟");
            System.out.printf("琵");
            System.out.printf("琶");
            System.out.println();
        }
    }

    public void second() {
        synchronized (lock){  //同步代码块, 在同一时刻, 只允许有一个线程执行这个方法
                              //因为两个同步代码块, 指向了同一把锁,所以在同一个时间内只允许执行一个代码块
            System.out.printf("魑");
            System.out.printf("魅");
            System.out.printf("魍");
            System.out.printf("魉");
            System.out.println();
        }
    }


    /**synchronized方法示例*/
    public synchronized void first(){ //synchronized方法, 直接在方法上加synchronized修饰即可
                                        //当两个方法想要互斥的时候, 需要获取同一把锁,
                                        //synchronized方法的时候, 默认指向this对象
        System.out.printf("魑");
        System.out.printf("魅");
        System.out.printf("魍");
        System.out.printf("魉");
        System.out.println();
    }

    public void second() {
        synchronized (this){
            System.out.printf("魑");
            System.out.printf("魅");
            System.out.printf("魍");
            System.out.printf("魉");
            System.out.println();
        }
    }



    /**synchronized静态方法*/
//    public synchronized static void first(){ //synchronized静态方法, 直接在方法上加synchronized修饰即可
//                                        //当两个方法想要互斥的时候, 需要获取同一把锁,
//                                        //synchronized方法的时候, 指向该类的字节码对象
//        System.out.printf("魑");
//        System.out.printf("魅");
//        System.out.printf("魍");
//        System.out.printf("魉");
//        System.out.println();
//    }
//
//    public void second() {
//        synchronized (Couplet.class){  //锁定类对象
//            System.out.printf("魑");
//            System.out.printf("魅");
//            System.out.printf("魍");
//            System.out.printf("魉");
//            System.out.println();
//        }
//    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值