zoukankan      html  css  js  c++  java
  • 改代码不是很熟悉------方法上加入synchronized关键字,会有性能问题---如何改善

    package com.bjpowernode.t14;

    import java.time.Duration;
    import java.time.LocalTime;

    public class Processor implements Runnable {

    private int num;

    private Object obj = new Object();

    /*
    下面在方法上加入synchronized关键字,会有性能问题
    思考如何改善
    */
    @Override
    public void run() {

    LocalTime begin = LocalTime.now();
    //------下面的代码不会出现线程安全问题------
    System.out.println(Thread.currentThread().getName() +"模拟其他非线程安全的操作");
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    //------上面的代码不会出现线程安全问题------

    //同步代码块,在有线程安全问题的代码上面加上同步代码块
    synchronized(obj) {//不能使用new Object(),每次线程执行的时候,都会创建一个新的Object对象
    //synchronized(Object.class) {
    //synchronized(String.class) {
    //synchronized(Test.class) {
    //synchronized(this) {
    //需要保证多个线程在执行同步代码块的时候,里面的锁对象是同一个
    //t1线程执行的时候new Object();
    //t2线程执行的时候也会new Object();
    //只需要将有线程安全问题的代码加锁即可
    for (int i = 0; i < 5; i++) {
    num += i;
    }

    System.out.println(Thread.currentThread().getName() + "------->" + num);

    //将num重新设置为0,保证其他线程在运行的时候num是0
    num = 0;
    }


    //------下面的代码不会出现线程安全问题------
    System.out.println(Thread.currentThread().getName()+"模拟其他非线程安全的操作");
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    //------上面的代码不会出现线程安全问题------

    LocalTime end = LocalTime.now();
    Duration between = Duration.between(begin, end);
    System.out.println(Thread.currentThread().getName() +"运行耗时: " + between.getSeconds() +"秒");
    }

    }

    -----------------------

    package com.bjpowernode.t14;

    public class Test {

    public static void main(String[] args) {
    //只创建一个Processor
    Processor p = new Processor();

    Thread t1 = new Thread(p,"t1");
    Thread t2 = new Thread(p,"t2");

    t1.start();
    t2.start();
    }

    }

  • 相关阅读:
    Mybatis与Hibernate概述
    Linux命令中:rsync和scp之间的区别
    更改了ssh文件下,还没有权限
    karaf 控制台 常用linux指令(2)
    karaf 控制台 常用linux指令(1)
    POM文件详解(2)
    POM文件详解(1)
    maven配置parent pom查找策略
    排序算法性能比较
    Eclipse下用NDK编译生成so文件
  • 原文地址:https://www.cnblogs.com/Koma-vv/p/9633988.html
Copyright © 2011-2022 走看看