解析Java线程同步锁的选择方法
发布时间:2023-02-08 11:02:32
在需要线程同步的时候如何选择合适的线程锁?
例:选择可以存入到常量池当中的对象,String对象等
public class SyncTest
{
private String name = "name";
public void method(String flag)
{
synchronized (name)
{
System.out.println(flag + ", invoke method ....");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
SyncTest test1 = new SyncTest();
SyncTest test2 = new SyncTest();
MyThread1 myThread1 = new MyThread1();
MyThread1 myThread2 = new MyThread1();
myThread1.syncTest = test1;
myThread2.syncTest = test1;
MyThread1 myThread3 = new MyThread1();
MyThread1 myThread4 = new MyThread1();
myThread3.syncTest = test2;
myThread4.syncTest = test2;
myThread1.start();
myThread2.start();
myThread3.start();
myThread4.start();
}
}
线程类:
public class MyThread1 extends Thread
{
SyncTest syncTest;
@Override
public void run()
{
syncTest.method(this.getName());
}
}
本来应该是要实现线程thread1和thread2同步,线程thread3和thread4同步的,但结果呢?
却是使得线程thread1、thread2、thread3、thread4同步了,很是郁闷。
我推荐选用的同步锁对象:
package com.rcx.thread;
public class SyncTest
{
// 特殊的instance变量,用于充当同步锁的对象
private byte[] lock = new byte[0];
public void method(String flag)
{
synchronized (lock)
{
System.out.println(flag + ", invoke method f....");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
SyncTest test1 = new SyncTest();
SyncTest test2 = new SyncTest();
MyThread1 myThread1 = new MyThread1();
MyThread1 myThread2 = new MyThread1();
myThread1.syncTest = test1;
myThread2.syncTest = test1;
MyThread1 myThread3 = new MyThread1();
MyThread1 myThread4 = new MyThread1();
myThread3.syncTest = test2;
myThread4.syncTest = test2;
myThread1.start();
myThread2.start();
myThread3.start();
myThread4.start();
}
}
推荐使用0长度的byte数组充当同步锁对象,不会产生很诧异的错误同时不会占用很大内存。


猜你喜欢
- 1,USB存储设备(如:U盘,移动硬盘): //USB存储设备 插拔监听与 SD卡插拔监听一致。 private USB
- 目录Mybatis简介Mybatis开发步骤:Mybatis的映射文件概述Mybatis的增删改查操作MyBatis的核心配置文件概述MyB
- 概述java.util.Random可以产生int、long、float、double以及Goussian等类型的随机数。这也是它与java
- MD5加密MD5是由MD2、MD3、MD4演变过来的,虽然MD5加密算法现在有些人已经将其解开了,但是它的加密机制依然很强大,我想绝大对数还
- 前言对于多线程,大家应该很熟悉。但是,大家了解线程池吗?今天,我将带大家全部学习关于线程池的所有知识。目录1. 简介2. 工作原理2.1 核
- 区别一如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。通俗来讲——MyBatis:一种操作数据库
- 前言说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动。但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方
- 用Dockerfile 构建一个java的编译环境,这里整理下实现步骤:1、包括以下软件包ubuntujdkmavensvn2、jdk、ma
- 目录一、SpringBoot 使用 Nacos Config 实现多环境切换1. 现象2. 引入依赖3. 添加bootstrap.yaml配
- 前言:GraphQL既是API查询语言,也是使用当前数据执行这些查询的运行时。GraphQL让客户能够准确地要求他们所需要的东西,仅此而已,
- 一、多媒体应用架构1.1 音视频传统应用架构通常,传统的播放音频或视频的多媒体应用由两部分组成:播放器:用于吸收数字媒体并将其呈现为视频和/
- 一、显式锁什么是显式锁?由自己手动获取锁,然后手动释放的锁。有了 synchronized(内置锁) 为什么还要 Lock(显示锁)?使用
- 引言之前写了一篇关于 TraceId 的文章:为全局请求添加 TraceId ,看日志再也不懵逼今天就接着 TraceId 做一些优化,如果
- 前言之前写过几篇关于输入系统的文章,但是还没有写完,后来由于工作的变动,这个事情就一直耽搁了。而现在,在工作中,遇到输入系统相关的事情也越来
- 引言native image是GraalVM中提供的一个命令,可以把字节码文件或Jar包编译成为一个二进制可执行文件,同时它自己也是用Jav
- 在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法,这
- 拿到了项目框架工程代码却没有uml图,那么方法之间的调用关系功能流转就不容易看出来,那么如何产生类图呢,记忆里方法有下:1.rose逆向工程
- 问题onClick事件是Android开发中最常见的事件。比如,一个submitButton,功能是点击之后会提交一个订单,则一般代码如下,
- 最近有很多小伙伴给我留言,分布式系统时代,线程并发,资源抢占,"锁" 慢慢变得很重要。那么常见的锁都有哪些?今天Tom哥
- 本文实例为大家分享了Android实现透明动画的具体代码,供大家参考,具体内容如下首页是有一个 Activitypublic class A