zoukankan      html  css  js  c++  java
  • 每天一道Java题[11]

    题目

    synchronized怎么实现线程同步?请修改《每天一道Java题[10]》中的MyRunnableThread类以解决三个线程都获取到10的问题。

       

    解答

    方法一:

    采用synchronized关键字包裹需要保证线程安全的代码块,来实现线程同步。语法格式为:

    Synchronized(expression){
        //需同步的代码
    }

    每天一道Java题[10]》中的MyRunnableThread类修改为:

    package me.huangzijian;
    
    public class MyRunnableThread implements Runnable {
    
        private int num = 10;
        private Object obj = new Object();
    
        @Override
        public void run() {
            int count = num;
            for (int i = 0; i < count; i++) {
                synchronized (obj) {
                    System.out.println(Thread.currentThread().getName() + ":" + num);
                    num--;
                }
            }
        }
    }

    方法二:

    采用synchronized关键字来修饰方法,从而用整个方法来进程线程同步。语法格式为:

    public synchronized void function(){
        //方法代码
    }

    每天一道Java题[10]》中的MyRunnableThread类修改为:

    package me.huangzijian;
    
    public class MyRunnableThread implements Runnable {
    
        private int num = 10;
        private Object obj = new Object();
    
        @Override
        public synchronized void run() {
            int count = num;
            for (int i = 0; i < count; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + num);
                num--;
            }
        }
    }

    发散思维

    1.synchronized关键字修饰方法,没有expression,那它怎么获取同步锁?

    解答:

    1. 对于实例的同步方法,使用this,即当前实例对象作为同步锁。
    2. 对于静态的同步方法,使用当前类的字节码对象。

       

    2.对于方法一,如果每次传给synchronized的都是新对象,能否实现同步的效果?

    解答:不能。因为不同的线程对应不同的同步锁,不具有排他性,故线程同步会失效。

       

  • 相关阅读:
    网络爬虫基础练习
    综合练习:词频统计
    画图
    Hadoop综合大作业
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    爬虫大作业
    熟悉常用的HDFS操作
    数据结构化与保存
  • 原文地址:https://www.cnblogs.com/huangzijian/p/6914733.html
Copyright © 2011-2022 走看看