精华内容
下载资源
问答
  • 所以代码中哪个线程先执行sychronized关键字的方法,哪个线程就持有这把锁 在静态方法上加锁synchronized 表示锁定.class类 类级别锁 public class MultiThread { private static int num = 0; /**不加static ...

    关键字sychronized获得的锁都是对象锁,而不是代码块的锁.
    所以代码中哪个线程先执行sychronized关键字的方法,哪个线程就持有这把锁
    在静态方法上加锁synchronized 表示锁定.class类 类级别锁

    public class MultiThread {
    	private static int num = 0;
    	
    	/**不加static 
    	 * 这样线程获得m1和m2两个对象的两个锁 
    	 * param值为a 设置num=100 设置成功
    	   param值为b 设置num=200 设置成功
    	   param值=b 设置num=200
    	   param值=a 设置num=200
    	   加了static
    	   param值为a 设置num=100 设置成功
    	   param值=a 设置num=100
    	   param值为b 设置num=200 设置成功
    	   param值=b 设置num=200
    	 * @param param
    	 */
    	public static synchronized void printNum(String param) {
    		 
    		try {
    			if (param.equals("a")) {
    				num = 100;
    				System.out.println("param值为a 设置num=100 设置成功");
    				Thread.sleep(1000);
    			}else {
    				num = 200;
    				System.out.println("param值为b 设置num=200 设置成功");
    			}
    			System.out.println("param值="+param+" 设置num="+num);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public static void main(String[] args) {
    		final MultiThread m1 = new MultiThread();
    		final MultiThread m2 = new MultiThread();
    		Thread t1 = new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				m1.printNum("a");
    			}
    		});
    		
    		Thread t2 = new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				m2.printNum("b");
    			}
    		});
    		
    		t1.start();
    		t2.start();
    	}
    }
    
    展开全文
  • ubuntu安装deb文件出现如下错误: $ sudo dpkg -i copytranslator_9.0.2_amd64.deb ...dpkg: 错误: 另外一个进程已经为 dpkg frontend lock 加锁 别人的解决方法如:`sudo rm /var/...1.查看具体是哪个进程加锁: $ ...

    ubuntu安装deb文件出现如下错误:

    $ sudo dpkg -i copytranslator_9.0.2_amd64.deb
    [sudo] yongzheng1723 的密码: 
    dpkg: 错误: 另外一个进程已经为 dpkg frontend lock 加锁
    

    别人的解决方法如:`sudo rm /var/lib/dpkg/lock 无效

    我的方法是
    1.查看具体是哪个进程加锁:

    $ sudo apt-get install -f E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 8925(apt-get)持有 N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。 E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

    2.查看apt的所有进程

    $ ps -e | grep apt
       8925 pts/0    00:00:01 apt-get
    
    

    3.杀死这个进程

    $ sudo kill 8925
    

    4.再次安装

    $ sudo dpkg -i copytranslator_9.0.2_amd64.deb
    正在选中未选择的软件包 copytranslator。
    (正在读取数据库 ... 系统当前共安装有 153641 个文件和目录。)
    准备解压 copytranslator_9.0.2_amd64.deb  ...
    正在解压 copytranslator (9.0.2) ...
    正在设置 copytranslator (9.0.2) ...
    正在处理用于 gnome-menus (3.36.0-1ubuntu1) 的触发器 ...
    正在处理用于 desktop-file-utils (0.24-1ubuntu2) 的触发器 ...
    正在处理用于 mime-support (3.64ubuntu1) 的触发器 ...
    正在处理用于 hicolor-icon-theme (0.17-2) 的触发器 ...
    
    

    安装成功

    展开全文
  • 题目一:判断对错。...A、transientB、synchronizedC、serializeD、static题目三:JVM内存不包含如下哪个部分( )A、stacksB、PC寄存器C、HeapD、Heap Frame题目一正确答案: B 错 解析:题目二正确答案:B syn...

    b32586c61cd9d30ec8ecc5d9cfc05129.png
    题目一:判断对错。List,Set,Map都继承自继承Collection接口。

    A、对

    B、错

    题目二:java 中哪个关键字可以对对象加互斥锁?

    A、transient

    B、synchronized

    C、serialize

    D、static

    题目三:JVM内存不包含如下哪个部分( )

    A、stacks

    B、PC寄存器

    C、Heap

    D、Heap Frame

    203928659d1bf0d5c7fcb867cdafa152.png
    题目一正确答案: B 错
    解析:

    89c745d278b1af3c6eacb9c1545b5223.png
    题目二正确答案是:B synchronized
    解析:

    synchronized关键字:用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。

    volatile:用来确保将变量的跟新操作通知到其他线程,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 synchronized关键字更轻量级的同步机制。

    serialize:Java 对象序列化为二进制文件。

    static关键字: static关键字可以修饰变量,方法,静态代码块。

    静态变量:
    由static修饰的变量称为静态变量
    静态变量属于类,而不属于某个对象
    静态变量它的副本只有一个(静态变量在类中只加载一次)

    静态方法:
    在静态方法中只能调用静态变量和静态方法
    在非静态方法中,可以调用静态方法或者变量。
    在静态方法中不能使用this和super关键字。

    静态代码块
    作用:用来给静态成员变量初始化

    题目三正确答案:D
    解析:

    92777b3df9a1d53feca624752806892d.png

    1.堆。堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -Xmx进行内存控制,值得一提的是从JDK1.7版本之后,运行时常量池从方法区移到了堆上。

    2.方法区。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,方法区在JDK1.7版本及以前被称为永久代,从JDK1.8永久代被移除。

    3.虚拟机栈。虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

    4.本地方法栈。与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

    5.程序计数器。指示Java虚拟机下一条需要执行的字节码指令。以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。所以Java在通过new创建一个类对象实例的时候,一方面会在虚拟机栈中创建一个该对象的引用,另一方面会在堆上创建类对象的实例,然后将对象引用指向该对象的实例。对象引用存放在每一个方法对应的栈帧中。

    展开全文
  • 用来提升对数据的处理速度,起初运用的线程池和普通数据库连接但是并发操作会造成死锁的问题出现,原因两个线程同时抢到了同一个资源造成的,解决方式给要执行的对象上一个锁,但是这样就相当于哪个线程先抢到...

    最主要的想法是运用多线程实现高并发的处理数据,用来提升对数据的处理速度,起初运用的是线程池和普通数据库连接但是并发操作会造成死锁的问题出现,原因是两个线程同时抢到了同一个资源造成的,解决方式是给要执行的对象上一个锁,但是这样就相当于哪个线程先抢到了就会将业务锁上其他都在等待,实际上就还是相当于单线程在执行业务。后来运用到了数据库连接池这样就解决了多个线程同时抢到资源后可以同时处理。以下是两种方式测试的结果。测试的方式是逐条删除表中第一条数据看线程处理时间。

    下表是运用线程池和使用普通数据连接,进行的单线程和多线程测试结果。
    测试时间 线程数 删除条数 执行处理总时长

    线程数 执行处理总时长
    1 169454 ms
    10 166140 ms
    1 169454 ms
    3 139143 ms

    以上可以看出,多线程与单线程在处理删除1000数据的时候有时单线程快,有时多线程快,在删除100条数据的时候也是没差多少,分析应该是多线程实际上执行逐条删除业务的时候,还是单线程在跑。因为它是普通数据库连接,对数据库操作只能是逐条操作的。所以必须对删除方法加上一个lock锁,如果不加就会报死锁。所以这样的多线程是无意义的。

    接下来我们运用了线程池及数据库连接池,进行单线程和多线程的执行速度测试。

    线程数 执行处理总时长
    1 34522 ms
    3 16767 ms
    1 35630 ms
    3 18295 ms

    以上可以看出多线程处理数据的优势明显的显示出来了,有几次慢的原因是数据库不是本地,数据库存在网络异常波动,导致数据库连接本身就很慢。但是大量的实验证明多线程处理速度比单线程快。这里有一点要说明,多线程存在同时抢到统一资源的情况是不可避免的,这样比如说两个线程都抢到同一ID,并对这个ID下的值进行删除,肯定会存在一个线程空删除数据的操作,这样数据量就不对了。但是又不想加锁那就得对要处理的业务进行判断.

    展开全文
  • 其一在程序开发中很多对象用于全局的记录,这些对象不管在程序的哪个地方被调用都应该指向同一个,例如日志对象。其二因为对象的创建和销毁都耗费资源的,如果对象的创建次数减少,势必能提高程序的整体运
  • 大家对于自身项目中都有本地缓存的逻辑,但这块的读写何种机制下哪个快,哪个慢,需要测试对比,以下测试报告,期望给大家一个借鉴,如果有更好的测试结果也欢迎大家一起讨论。 以下测试开启10个并发任务对同一个...
  • 比如我有生产者线程,有消费者线程,现在交给两个线程加锁,通过这个锁 我创建了两个监视器来监视这两种线程,那我怎么知道两个监视器分别监视的生产者还是消费者呢,希望前辈指点 class Resource { ...
  • Java在一开始就提供了synchronized关键字,用于多线程之间的同步。它使用简便,不会出现拿锁之后不归还的情况,可以避免一些编程错误。 而jdk5时提供的concurrent...首先单线程的加锁情况,见以下代码: impo...
  • A. synchronized ...用来给对象和方法或者代码块加锁. 当它锁定一个方法或者一个代码块的时候, 同一时刻最多只有一个线程执行这个段代码 volatile: 用来确保将变量的更新操作通知到其他线程, 当把变...
  • 此篇文章探讨MySQL数据库的锁,讨论MySQL各种语句将如何加锁,以及加锁的“效果”,主要针对默认的InnoDb引擎。基于MySQL5.6之后的版本。有心力的可以直接看MySQL官方文档,说的更为详细:14.7.3由InnoDB中的不同SQL...
  • 最近总结了一波死锁问题,和大家分享一下,我这也从网上各种浏览博客得来,希望原作者见谅,参考博客地址都在下方。Mysql 锁类型和加锁分析MySQL有三种锁的级别:页级、表级、行级。表级锁:开销小,加锁快;不会...
  • InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,一行一行的删除InnoDB 把数据和索引存放在表空间里面跨平台可直接拷贝使用...
  • 加锁对象的 notify() 方法,由 JVM 唤醒一个处于等待状态的线程,具体哪个线程不确定,且与优先级无关 加锁对象的 notityAll() 方法,唤醒所有处入等待状态的线程,让它们重新竞争对象的锁 线程的 sleep() 方法,...
  • 非科班生的Android秋招求职经历

    千次阅读 2017-10-20 10:18:47
    拼多多 学霸提前批Android研发工程师 offer笔试基于给定接口实现ImageLoader框架一面 自我介绍 静态变量和实例变量的区别 重写equals()方法的注意事项;...在方法上加锁是加在哪个对象上? 进程间读写文
  • 3.使用的时候必须加锁,等在哪个对象上,就对哪个对象加锁(wait()执行成功时会释放锁,醒来时会重新请求锁) 4.哪个线程调用wait(),哪个线程进入等待集 5.notify()只唤醒一个,但不保证哪一个,但...
  • MySQL/InnoDB的加锁,一直一个面试中常问的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等。于是今天就对这几个概念...
  • Event Loop 什么

    2020-04-30 13:59:51
    我引用一句烂大街的话:假设js同时有两个线程,一个线程想要在某个dom节点上增加内容,另一个线程想要删除这个节点,这时要以哪个为准呢?当然,多线程有多线程的解决办法,加锁啊,但是这样的话,又会引入锁、状态...
  • Linux--线程中

    2020-09-03 21:52:01
    线程间的数据共享: .data和.bss .heap ...使用临界资源之前,对互斥锁执行加锁状态,如果锁是加锁状态,则加锁操作阻塞,直到有对其加锁过程的线程进行了解锁操作;使用临界资源后,需要对互斥锁进行
  • ReentrantLock加锁和释放锁的底层原理 好了,那么现在如果有一个线程过来尝试用ReentrantLock的lock()...另外,这个AQS内部还有一个关键变量,用来记录当前加锁是哪个线程,初始化状态下,这个变量null。 接...
  • ConcurrentHashMap线程安全并且提高性能原因就在于:对map中的读并发的,无需加锁;只有在put、remove操作时才加锁,而加锁对需要操作的segment加锁,不会影响其他segment的读写,由此,不同的segment之间可以...
  • 当多个线程需要协同完成一件事时,可以加锁+wait,notify一起完成。...还有创建一个全局变量用来控制具体执行的是哪个线程;每个方法都被执行26次。 public class Solution1006 { public static v...
  • synchronized同步作用在某个对象上...synchronized使用时,需要明确指定作用在哪个对象上的,哪个对象上锁。 最常见的对当前对象this进行加锁;在某个方法上加synchronized,相当于对当前对象加锁。 ...
  • 正确使用加锁原语的关键严密地指定要保护哪个 资源并且确认每个对这些资源的存取都使用了正确的加锁方法. 在我们的例子驱动中, 感 兴趣的所有东西都包含在 scull_dev 结构里面, 因此它我们的加锁体制的逻辑范围...
  • 线程的通信

    2019-10-19 18:35:11
    线程怎样通信 【1】锁机制:包括互斥锁、条件变量、读写锁和自旋锁 互斥锁:当锁被占用时试图对其加锁的...读写锁:以写模式加锁而处于写状态时任何试图加锁的线程(不论读或写)都阻塞,当以读状态模式加锁而处...
  • 在进入正题之前要搞清楚两个问题:一为什么需要分布式锁,二Redis为什么能够实现分布式锁。假设现在有一个应用部署在了三台机器上,...就好比一个房间有三个门,不惯打开哪个门上的锁都能进入这个房间。此时...
  • 在执行时,哪个线程持有互斥锁,并对共享资源成功加锁后,才能对共享资源进行操作,此时其它线程不能对共享资源进行操作。 只有在持有锁的线程将锁解锁释放后,其它线程才能进行抢锁加锁操作。 互斥锁的主要作用...
  • 5.6. 锁陷阱

    2012-10-08 00:08:21
    多年使用锁的经验 -- 早于 Linux 的经验 -- 已经表明加锁可能非常难于正确的. 管理并发一个固有的技巧性的事情, 有很多出错的方式. 在这一节, 我们快速看一下可能出错的东西. 5.6.1. 模糊的规则 ...
  • 拼多多 学霸提前批Android研发工程师 offer 笔试 基于给定接口实现ImageLoader框架 一面 自我介绍  静态变量和实例变量的区别  ...重写equals()方法的注意事项;...在方法上加锁是加在哪个对象上? ...
  • 在启动时创建 10个MySQL连接和10个锁。然后fork出100个worker进程。worker进程随机从pool中取一个连接,先进行加锁操作,然后执行mysql_query。...这时候没办法区分到底哪个回包对应的。mysql_q...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 126
精华内容 50
关键字:

哪个是加锁