首页 > 其他分享 >解决线程安全问题方式一

解决线程安全问题方式一

时间:2023-08-20 16:02:58浏览次数:72  
标签:tickets MyRunnable synchronized Thread 安全 线程 解决 new 100

1,同步代码块

-格式:

synchronized(对象){

需要同步的代码;

}

-注意:这个对象,同步代码块可以解决线程安全问题的根本就在于这个对象。

这个对象就好比是锁的功能。

-这个对象可以是任意对象,但是多个线程必须是同一个对象。

2,同步的好处:

-解决了多线程中的线程安全问题

3,同步的弊端

-当线程很多的时候,因为每个线程来了之后都要判断同步上的锁,这个很

耗费资源和时间,降低了程序的运行效率。

package com.momo.thread;

import com.momo.domain.Stu;

public class MyRunnable implements Runnable{

private int tickets = 100;

// Object o = new Object();

Stu s = new Stu();

@Override

public void run() {

while (true){

// synchronized (new Object()) {//注意不能这样

synchronized (s) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

if (tickets > 0) {

System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票");

}

}

}

}

}

package com.momo.demo;

import com.momo.thread.MyRunnable;

public class Demo1 {

public static void main(String[] args) {

MyRunnable mr = new MyRunnable();

Thread t1 = new Thread(mr,"小明");

Thread t2 = new Thread(mr,"小花");

Thread t3 = new Thread(mr,"小美");

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

}

package com.momo.thread;

import com.momo.domain.Stu;

public class MyRunnable implements Runnable{

// private int tickets = 100;

private static int tickets = 100;

// Object o = new Object();

private Stu s = new Stu();

private int i = 0;

@Override public void run() { while (true){ if(i%2==0){ // synchronized (s) { // synchronized (this) { synchronized (MyRunnable.class) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票"); } } }else{ /* synchronized (s) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票"); } }*/ // maiPiao(); // maiPiao2(); maiPiao3(); } i++; } } /* * 静态同步方法的锁对象是当前类的字节码文件对象 MyRunnable.class * */ private static synchronized void maiPiao3(){ if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票"); } } /* * 同步方法:就是把同步关键字加到方法上 * 锁对象是this * */

/* private synchronized void maiPiao2(){

if (tickets > 0) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票");

}

}//

* 如果一个方法从刚开始就发现它里面的代码被同步了,那么

* 就可以把这个同步加到方法上, 就变成了同步方法。

* //

synchronized (s) {

if (tickets > 0) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票");

}

}

}//

public void run() {

while (true){

// synchronized (new Object()) {//注意不能这样

synchronized (s) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

if (tickets > 0) {

System.out.println(Thread.currentThread().getName() + "卖出了第:" + (tickets--) + "张票");

}

}

}

}*/

}

package com.momo.demo;

import com.momo.thread.MyRunnable;

public class Demo1 {

public static void main(String[] args) {

MyRunnable mr = new MyRunnable();

Thread t1 = new Thread(mr,"小明");

Thread t2 = new Thread(mr,"小花");

Thread t3 = new Thread(mr,"小美");

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

}

标签:tickets,MyRunnable,synchronized,Thread,安全,线程,解决,new,100
From: https://blog.51cto.com/u_16230968/7162080

相关文章

  • ubuntu无法进入系统,安全模式修复内容
    背景环境ubuntu22服务器只是重启了下,就进不去系统了,查看了下启动报错情况,报无法识别某一个盘的ext4格式,于是想起来,那就是前端时间加了个/etc/fstab的配置,应该是挂载盘的格式没写对步骤进advanced模式选恢复模式,按e编辑修改只读为可读写把rorecoverynomodesetdis_ucode......
  • jmeter详解-线程组详解(4)-tearDown Thread Group
    tearDownThreadGroup线程组:在测试任务线程组运行结束后被运行。通常用来做清理测试脏数据、登出、关闭资源等工作。应用场景举例:A、测试数据库操作功能时,用于执行关闭数据库连接的操作。B、测试用户购物功能时,用于执行用户的退出等操作。tearDownThreadGroup线程的行为与......
  • TWCMS您的IP地址已改变,为了安全考虑,请重新登录
    twcms您的IP地址已改变,为了安全考虑,请重新登录,很多人在群里重复问这个问题的解决方案,决定写篇文章帮大家解决直接进入主题:第一步:找到并打开admin/control/admin_control.class.php第二步:找到下面这段代码:<preclass="brush:php;toolbar:false">if(empty($this->_group)){$e......
  • 虚拟机linux无法实现与原机windows之间的复制和拖拽文件--已解决
    在虚拟机(我用的是Ubuntu)桌面右键打开终端,输入第一行sudoaptinstallopen-vm-tools中间全部yes,然后关闭终端然后再次在桌面打开终端,输入sudoaptinstallopen-vm-tools-desktop中间全部yes完成......
  • MySql Workbench 迁移工具 migration 提示缺少pyodbc 2.1.8 的解决方法
    想把公司的数据库转到MySQL,所以想装个MySQL测试,发现新版的MySQL(8.0.34)默认安装还是有不少问题,##一、譬如表、字段大小写的问题:lower_case_table_names=0--表名存储为给定的大小和比较是区分大小写的(linux默认)lower_case_table_names=1--表名存储在磁......
  • 为什么 Java 坚持多线程不选择协程?
    1.引言在编程的世界里,多线程和协程是两种主要的并发处理方法。Java,作为一种广泛使用的编程语言,从其早期版本开始就深入支持多线程。那么,为什么Java坚持使用多线程而不是协程?要理解这个问题,我们需要深入探讨两者之间的差异以及Java的设计哲学。2.多线程和协程的基本差异多线程:线程......
  • 进程和线程说明
     进程和线程说明1、进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位2、线程是进程的一个执行实例,是程序执行的最小单元,他是比进程更小的能独立运行的基本单位3、一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行4、一个程序至少有一......
  • 谷歌浏览器不能网页录音解决方案
    在浏览器的地址栏里输入chrome://flags/#unsafely-treat-insecure-origin-as-secure并回车、然后作如下修改   里面输入你要操作的网址域名即可......
  • VS2015项目.net-framework-4.5.2升级或新建项目无法选择framework 4.6.2(解决办法)
    VS2015里面没有.NETFramework4.6.2VS2015默认安装的目标框架最高是.NETFramework4.6.1,但是我的项目里面某些NuGet软件包更新需要依赖.NETFramework4.6.2,项目就需要升级到目标框架.NETFramework4.6.2VS2015项目无法选择framework4.6.2的解决办法:第一步:系统环境安装.NET......
  • jmeter详解-线程组详解(3)-再看Ramp-Up(seconds)
    在jmeter线程组的第一篇文章中对Ramp-Up时间讲过一点:jmeter详解-线程组详解(1)-ThreadGroup 这里我们再来看一下Ramp-Up(seconds)在jmeter中Ramp-Up是什么?JMeterRamp-up周期是以秒为单位,ApacheMeter将花费多少时间将所有测试用户(线程)添加到测试执行中。或者换句话说,需要多......