文档章节

多线程的锁,安全问题

应运之子
 应运之子
发布于 2017/07/13 22:59
字数 488
阅读 9
收藏 0

a 当多条语句在操作同一个线程共享数据时,一个线程对多条语句的执行只执行了一部分,另一个线程就参与进来执行,导致了共享数据错误;我们就需要的是让正在执行的线程执行完了再让其他线程执行;

b  同步的前提:1必须要有2个或2个以上的线程

                    2、必须是同一个线程使用同一个锁

c   业务逻辑写在run()里面,给线程起名字;

1:   同步代码块:synchronized(对象) {//里面可以放类的字节码对象或者对象,其实锁是是资源

需要被同步代码

}

package DuoThread;

class Test implements Runnable {
	private int tick = 100;
	
	public void run() {
		while(true) {
			synchronized(Test.class) {
				if(tick > 0) {
					try {
						Thread.sleep(10);
					}catch (Exception e){}
					System.out.println(Thread.currentThread().getName() + "...." + tick--);
				}
			}
		}
	}
}
public class Ticket2 {

	public static void main(String[] args) {
		Test t = new Test();
		Thread t1 =new Thread(t);
		Thread t2 =new Thread(t);
		Thread t3 =new Thread(t);
		Thread t4 =new Thread(t);

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

}

4个线程交替出票

2: 同步函数     (synchronized放在方法的void之前),非static的方法锁是this,static方法的锁是类的字节码对象(xxx.class)

package DuoThread;

class Test implements Runnable {
	private int tick = 100;
	
	public synchronized void run() {
		while(true) {
			//synchronized(Test.class) {
				if(tick > 0) {
					try {
						Thread.sleep(10);
					}catch (Exception e){}
					System.out.println(Thread.currentThread().getName() + "...." + tick--);
				}
			//}
		}
	}
}
public class Ticket2 {

	public static void main(String[] args) {
		Test t = new Test();
		Thread t1 =new Thread(t);
		Thread t2 =new Thread(t);
		Thread t3 =new Thread(t);
		Thread t4 =new Thread(t);

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

}

只有一个线程在执行,因为一个线程执行了,其他线程就进不去

3.面试题: 3.1 2个同步方法,一个static,一个非static,他们可以一起被访问,因为static在内存中只有一份,锁的力度不同

                3.2 2个同步方法,不能同时访问,因为他们都要获取对象,会发生互斥

总之,就是看他们锁的是不是同一个资源;

© 著作权归作者所有

上一篇: String和int 转换
下一篇: 多线程
应运之子
粉丝 7
博文 33
码字总数 10932
作品 0
南京
程序员
私信 提问
多线程(二)

线程安全问题 这里以简单的卖票程序为例开始本文的讲解,通过运行该卖票程序可以发现有可能打印出0、-1、-2等错票,这就表明多线程的运行出现了安全问题。产生的原因可归纳为两点: 线程任务...

yerenyuan_pku
2017/10/08
0
0
Java 学习(28)---(线程的控制 / 生命周期 /解决安全问题)

线程的控制 休眠线程 加入线程 礼让线程 后台线程 终止线程 线程的生命周期 多线程安全问题 判断一个程序是否有线程安全问题的依据 ) A:是否有多线程环境 B:是否有共享数据 C:是否有多条语句...

姜白告
2018/08/07
0
0
6.JUC线程高级-Lock 同步锁

1. 解决多线程安全问题的方式: 同步代码块 同步方法 JDK1.5之前才使用上述两种方式借助于:。之后出现一个新的显示同步锁 同步锁 Lock 显示锁:必须通过 lock() 方法上锁,通过 unlock() 方...

潘天涯
2018/09/04
0
0
多线程安全(synchronized、三大特性、Java内存模型)

线程安全问题? 什么是线程安全问题?简单的说,当多个线程在共享同一个变量,做读写的时候,会由于其他线程的干扰,导致数据误差,就会出现线程安全问题。 比如说,多个窗口同时卖票这个案例...

天王盖地虎626
06/19
29
0
【多线程并发访问的安全性问题】

【多线程并发访问的安全性问题】 多线程并发访问的安全性问题 首先要知道的是:多线程安全性问题产生的原因是什么? 多线程并发访问是指当多个线程无序的访问同一个共享资源时,这个线程就受...

Hello火山
01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称...

武培轩
28分钟前
7
0
CountDownLatch实现的并发框架

目录结构 package com.**.**.base.support.executor;import lombok.NoArgsConstructor;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp......

MR_TE
30分钟前
11
0
学习记录(day06-事件、按键修饰符、计算属性)

[TOC] 1.1 事件修饰符/按键修饰符 vue 通过事件修饰符对dom事件细节进行控制 <标签 @事件.修饰符="函数"></标签>.prevent ---阻止浏览器默认行为.stop ---阻止浏览器事件冒泡.e...

庭前云落
49分钟前
9
0
006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
56分钟前
22
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
58分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部