java实现线程同步,如果有多个线程同时进行,那么程序很有可能会出错。
例如 模拟一个卖票程序
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//2.创建线程上执行的任务对象
MyTask m=new MyTask();
/*//3.创建线程
Thread t=new Thread(m);
//4.启动线程
t.start();*/
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
}
}
//1. 创建一个任务类 ,实现Runnable
class MyTask implements Runnable
{
private int tickets=50;
public void run() {
// TODO Auto-generated method stub
while(true)
{
if(tickets>0)
{
System.out.println(Thread.currentThread().getName()+": "+tickets);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tickets--;
}
}
}
}
输出结果就有可能会有重复的票号
Thread-1: 50
Thread-2: 50
Thread-0: 50
Thread-3: 50
Thread-1: 49
Thread-2: 48
。。。
所以在编写类似的程序的时候必须要在当前线程加锁,
在此可以有两种方法,一种是加明锁,也就是java.util中的Lock;
另一种则是加暗锁,也就是在写run方法的时候加上synchronized;
synchronized能传递一个Object对象,这个对象类似于当前的一个资源,在开始的时候值为一,当开始执行的时候,值会变成零,所以在其他线程想要用此资源的时候,资源数为零,因此,只有当这个方法执行完毕,其他线程才能够执行。
加暗锁
public class Test { //用synchronized方法锁定当前线程
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//2.创建线程上执行的任务对象
MyTask m=new MyTask();
/*//3.创建线程
Thread t=new Thread(m);
//4.启动线程
t.start();*/
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
}
}
//1. 创建一个任务类 ,实现Runnable
class MyTask implements Runnable
{
private int tickets=50;
private String s="";
public void run() {
// TODO Auto-generated method stub
while(true)
{
synchronized(s)
{
if(tickets>0)
{
System.out.println(Thread.currentThread().getName()+": "+tickets);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tickets--;
}
}
}
}
}
----------------------------------------------------------------------
加明锁
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//2.创建线程上执行的任务对象
MyTask m=new MyTask();
/*//3.创建线程
Thread t=new Thread(m);
//4.启动线程
t.start();*/
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
}
}
//1. 创建一个任务类 ,实现Runnable
class MyTask implements Runnable
{
private int tickets=50;
private String s="";
Lock lock=new ReentrantLock();
public void run() {
// TODO Auto-generated method stub
while(true)
{
lock.lock(); //锁定下面的代码
if(tickets>0)
{
System.out.println(Thread.currentThread().getName()+": "+tickets);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tickets--;
}
lock.unlock(); //在这段代码执行后解锁
}
}
}
分享到:
相关推荐
### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...
Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含...
### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...
#### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的应用程序,每个进程拥有...
Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)管理。本教程将深入讲解Java线程的基础知识,帮助你掌握多...
#### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用程序中(如`java.exe`),...
### Java线程详解 在Java开发中,线程(Thread)是执行程序的基本单位,它是一种轻量级的进程,可以实现并发操作,提高程序的运行效率。本篇内容将围绕Java线程的基础知识、创建方式、生命周期以及线程同步等核心...
#### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个进程拥有独立的内存空间。...
- 进入阻塞状态:线程尝试获取一个已经被其他线程锁定的对象锁。 - 进入睡眠状态:线程调用`Thread.sleep()`方法。 4. **等待/阻塞/睡眠状态到可运行状态**: - 等待状态:线程被唤醒(调用`notify()`或`...
### Java线程与并行详解 #### 一、Java线程基础 在Java中,**线程**是一种轻量级的进程,它允许一个程序同时执行多个任务,从而提高程序的执行效率。Java从1.0版本开始就支持多线程编程,并在后续版本中不断完善。...
这意味着该方法在执行时会自动锁定当前对象实例,即`this`关键字。当一个线程正在执行这个方法时,其他试图访问同一对象实例上任何同步方法的线程将被阻塞,直到当前线程释放锁。 同步方法的语法简单明了: ```java...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
* 在 sell() 方法中,我们使用 synchronized(this) 锁定当前对象。 * 由于两个线程都在等待对方释放 obj 对象,所以它们之间形成了循环等待的关系,导致死锁的情况。 解决线程死锁 要解决线程死锁,我们可以使用...
Java线程机制是Java编程语言中的一个重要特性,它使得开发者能够在单个应用程序中同时执行多个任务,从而提高程序的效率和响应性。Java通过内置的线程支持使得多线程编程变得相对简单,与C++等其他语言相比,Java...
Java线程是Java编程中的核心概念,它允许程序并发执行多个任务,提高系统资源的利用率,从而提升程序的效率和响应速度。Java线程的管理、同步和通信是每个Java开发者必须掌握的关键技能。 在Java中,线程的创建主要...
### Java线程详细总结 #### 一、Java线程简介 Java中的线程是一个轻量级的进程,它能够在一个程序中并发地执行多个任务。Java语言直接支持线程的概念,这使得Java成为多线程编程的理想选择。与进程相比,线程具有...
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。...
synchronized 关键字可以用来锁定对象或方法,防止多个线程同时访问同一个共享资源。 在 Java 中,还有其他线程同步机制,如volatile 变量、Atomic 变量、Lock 接口等。这些机制可以用于解决不同类型的线程同步问题...
Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。线程优先级并不保证执行顺序,但高优先级的线程更有可能获得CPU资源。 4. **线程的休眠与唤醒**: - `Thread....