多线程对同一个对象操作

多线程实现的两种方式:

  继承Thread类

  实现Runnable接口

这两种方式都必须重写run()方法。

当多线程对同一个对象操作时,必须实现Runnable接口,而不能继承Thread类。因为继承Thread类实现多线程时,操作的是不同的对象。

1 Runnable r=new RunnableImpl();
2 Thread t1=new Thread(r);
3 Thread t2=new Thread(r);
4 t1.start();
5 t2.start();

两个线程传同一个对象,相当于这两个线程对同一个对象进行操作。

注意:多线程对同一个对象操作的时候一定要加锁synchronized,同时传一个锁旗标。

   加锁时,原则上要双重检查。

   锁旗标对同一个对象有用,如果是两个对象,则这两个对象分别有自己的锁旗标,此时锁旗标就会失效。

   synchronized不仅可以加在代码块上,还可以加在方法上。当加在方法上时,锁旗标是this,谁调用这个方法,this就是谁,只要是同一个对象就行·。

   synchronized提高了安全性,降低了性能。

若有错误之处,欢迎指正。谢谢!

原文地址:https://www.cnblogs.com/hong-yu0415/p/9116263.html

时间: 2024-10-09 05:33:45

多线程对同一个对象操作的相关文章

Java多线程对同一个对象进行操作

示例: 三个窗口同时出售20张票. 程序分析: 1.票数要使用一个静态的值. 2.为保证不会出现卖出同一张票,要使用同步锁. 3.设计思路:创建一个站台类Station,继承THread,重写run方法,在run方法内部执行售票操作! 售票要使用同步锁:即有一个站台卖这张票时,其他站台要等待这张票卖完才能继续卖票! package com.multi_thread; //站台类 public class Station extends Thread { // 通过构造方法给线程名字赋值 publ

java多线程下如何调用一个共同的内存单元(调用同一个对象)

1 /* 2 * 关于线程下共享相同的内存单元(包括代码与数据) 3 * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. 4 * 对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时. 5 * 目标对象就会自动调用接口中的run()方法 6 * */ 7 8 /* ----------------举例子------------------- */ 9 10 /* 11 * 使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶

Java多线程编程核心 - 对象及变量的并发访问

1.什么是“线程安全”与“非线程安全”? “非线程安全”会在多个线程对同一对象总的实例变量进行并发访问时发生,产生的后果是“脏读”,也就是取到的数据其实是被更改过的. “线程安全”是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象. 2.非线程安全例子?怎么解决? 非线程安全 package com.jvm.thread; public class HasSelfPrivateNum { private int num =  0; public void add(String usern

JNI头文件详解(三)对象操作

JNI 中Java对象操作: 对象操作相关函数: (AllocObject,NewObject,NewObjectA,NewObjectV,GetObjectRefType,IsInstanceOf,IsSameObject) 1.对比函数特性. 1.1  AllocObject 函数和NewObject,NewObjectA,NewObjectV,之间的区别, 共同点 不同点:   AllocObject不需要调用如何构造函数产生一个Java对象.而NewObject,NewObjectA,N

普通int值在多线程下的递增操作

Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下:  java.util.concurrent.atomic.AtomicBoolean;  java.util.concurrent.atomic.AtomicInteger;  java.util.concurrent.atomic.AtomicLong;  java.util.concurrent.atomic.AtomicReference;  下面是一个对比 AtomicInteger 与 普通 int

C#的 == / equals() / object.ReferenceEquals() 判断是否为同一个对象的区别及各自的使用场景

总结:在判断两个对象是否是同一个对象的时候只能用object.referenceEquals()来做判断 ==双等号其实调用的就时Equals()方法

python多线程读取同一个文件

多线程读取同一个文件,要求不能重复,不能遗漏. 最开始尝试了一种方法(后来实践证明是无效的) 主线程分配给每个读线程需要读取文件中哪些行, 比如线程1读取1-10行,线程2读取11-30行. 然后每个线程通过readline()来读取,读到的行如果不属于本线程的范围,则continue跳过. 实践证明,这若干个线程并没有按照我们期望来读. 我的猜想是,通过open来打开一个文件,多个线程返回的是同一个句柄, 或者一个文件的文件指针只有一个. 经过网上搜索和实践,总结出有以下方法支持多线程读取同一

Javascript 笔记与总结(2-3)Javascript 运算符、控制结构与对象操作

[连接运算符 + ] <script> console.log(1+2+'a'+3+4); </script> 输出: 3a34 [逻辑运算符]返回的是最早能判断表达式结果的那个值 例① <script> var a = false; var b = 10; var c = true; var d = a || b || c; console.log(d); console.log(typeof(d)); </script> 输出: 10 number 例②

Python的对象操作(一)

python支持对象和函数   1. python是解释型语言,逐行运行 2. 对象调用 例子:删除文件的一个例子 2.1 先定义一个类 class MyApp: 2.2 import 引用要用到的模块 __author__ = 'Bright' import shutil import os """ * 对象操作实战 * 上演出多个文件 """ class MyApp: def __init__(self, root): self.root =