改代码不是很熟悉------方法上加入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();
}
}
改代码不是很熟悉------方法上加入synchronized关键字,会有性能问题---如何改善的更多相关文章
- Spring事务方法上增加synchronized真的有效果吗?
此文转载,Spring事务本身是一个非常复制的问题,再加上线程并发处理就更加要主要了,由于再开发中有很多朋友会范与下文同样的错误,因分享给大家. 前言 Spring事务的一个奇怪的问题. 朋友问了我一 ...
- Java_慎用方法级别的synchronized关键字
为什么要这么说呢, 因为笔者被这个坑过(其实是自己坑自己)╮(╯_╰)╭ 先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代 ...
- 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)
不多说,直接上干货! 扩展博客 牛客网Java刷题知识点之多线程同步的实现方法有哪些 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查 ...
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法 第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...
- 帮初学者改代码——playerc之“练习:求完数问题”(上)
原文:“练习:求完数问题” 原代码: // #include <stdio.h> #include <stdlib.h> #include <math.h> #de ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- iOS书摘之编写高质量iOS与OS X代码的52个有效方法
来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...
随机推荐
- golang 的时间格式化操作
怎么做 简而言之 time.Now().Format("2006-01-02 15:04:05") 你将会获得如同 yyyy-MM-dd hh-mm-ss 这样的输出. 还可以 在 ...
- 【1】【JUC】JDK1.8源码分析之ArrayBlockingQueue,LinkedBlockingQueue
概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Co ...
- db.properties文件的配置格式
#加载驱动 mysql.driver=com.mysql.jdbc.Driver #加载数据库 mysql.url=jdbc:mysql://localhost:3306/floor_shop #用户 ...
- HAX kernel module is not installed
dev.android.emulator.haxm 运行emulator -avd xxx来启动名为xxx的模拟器,但报如下错误: emulator: ERROR: x86 emulation cur ...
- 破解WEP工具wesside-ng
1.关于wesside-ng wesside-ng是一款自动化的WEP破解工具,该工具采用了多种WEP加密破解技术.它首先会自动明确目标无线网络,然后尝试与之相关联,在获得PRGA(伪随机生成算法)异 ...
- SQL——Hibernate SQL增删改查
1.查询list数据 实例:user login public String userLogin(){ Session session = HibernateSessionFactory.getSes ...
- VS2013中修改MFC对话框左上角和exe图标
一.开发环境 1.VS2013: 2.C++ / MFC: 二.更改步骤 1)创建一个新工程,可以什么都不加.打开“资源视图”, 右键点击项目名称,选择“添加资源”,导入“Icon”资源文件(事先准备 ...
- History API:ScrollRestoration
By Paul Lewis(设计和性能倡导者) 翻译:江天 使用history api管理url是非常棒的一件事,可以说这是一个好web app的极为重要的特点.但它有一个缺点,滚动位置虽然被存储 ...
- 【转】利用URLConnection来发送POST和GET请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- Jetson tk1 刷机教程
前期准备: 1. Jetson TK1开发板. 2. 安装有ubuntu系统的PC(或者ubuntu虚拟机)切记:不管是PC还是虚拟机,务必确保有大于5G的存储空间,之后安装过程会作详细解释. 3 ...