package com.tianmushanlu.thread;
/**
* 创建步骤:
* 1. 自定义一个类继承Thread类。
* 2. 重写Thread类的run方法,把自定义线程的任务代码写在run方法上。
* 3. 创建Thread的子类对象,并且调用start方法启动一个线程。
*
* 出现线程安全问题的根本原因:
* 1. 存在两个或者两个以上 的线程对象,而且线程之间共享着一个资源。
* 2. 有多个语句操作了共享资源。(使用同步代码块,使多个语句操作同步执行)
*
* 同步代码块要注意事项:
* 1. 任意的一个对象都可以做为锁对象
* 2. 在同步代码块中调用了sleep方法并不是释放锁对象的。
* 3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率的。
* 4. 多线程操作的锁 对象必须 是唯一共享 的。否则无效。
*
*
*
*/
class TicketWindow extends Thread {
/**
* 票数
* 非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据的。
*
* num是非静态的,
* 非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份。(见图1所示)
*/
static Integer num = 50;
public TicketWindow(String name) {
super(name);
}
@Override
public void run() {
while(true) {
/**
* 使用同步代码块,使多个语句操作同步执行
* 原则上任意的对象都可以作为锁对象,凡是对象内部都维护了一个状态的
* java中同步机制就是使用了对象的状态作为了锁的标识
* state = 0 ----->开
* state = 1 ----->关
* 因而锁对象必须是一个共享对象
* 此对象必须用static修饰,如:
* static Object o = new Object();
* synchronized (o){
* 需要被同步的代码..................
* }
*
*如下方式是最简单的锁对象,
* 因为双引号引起来的字符串一旦存在了字符串常量词中就不会再创建了,
* 因而所有的线程都将共同使用字符串常量词中的那个锁对象
* synchronized ("锁对象") {
* 需要被同步的代码..................
* }
*
*/
synchronized ("锁对象") {
if(num > 0) {
System.out.println(Thread.currentThread().getName()+"售出了第"+num+"票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
num--;
}else{
System.out.println("票以售罄...........");
break;
}
}
}
}
}
public class ThreadDemo{
public static void main(String[] args) {
/**
* 创建3个窗口进行售票
*/
TicketWindow thread1 = new TicketWindow("售票窗口1");
TicketWindow thread2 = new TicketWindow("售票窗口2");
TicketWindow thread3 = new TicketWindow("售票窗口3");
/**
* 开启线程售票
*/
thread1.start();
thread2.start();
thread3.start();
}
}
分享到:
相关推荐
- **synchronized** 关键字:用于同步方法或同步代码块,确保同一时间只有一个线程可以执行特定代码。 - **volatile** 关键字:保证共享变量的可见性,防止线程间的数据不一致。 - **wait()** 和 **notify()** / **...
// 同步代码块 } ``` #### 显式锁(ReentrantLock) `ReentrantLock`是一种更灵活的锁机制,可以实现更细粒度的控制。 ```java ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // 执行临界区...
如果`synchronized`修饰一个代码块,则称为同步代码块。 #### 三、代码解析 ```java import java.io.*; import java.util.*; import java.text.SimpleDateFormat; public class TestThread extends Thread { ...
synchronized可以修饰方法或代码块,当一个线程正在执行synchronized代码时,其他线程必须等待。 ```java public class Counter { private int count = 0; public synchronized void increment() { count++; }...
Java中的`synchronized`用于控制并发访问,确保同一时间只有一个线程能执行特定代码块,避免数据不一致。可以修饰方法或代码块: - 修饰方法:整个方法都将是同步的。 - 修饰代码块:指定需要同步的资源,如共享...
3. **调度策略**:Java线程调度支持不同优先级线程的抢占式调度,但并不直接支持相同优先级的时间片轮换调度。操作系统(如Windows XP)通常会提供时间片轮换的支持。 4. **创建和切换开销**:相比进程,线程的创建...
Java提供了synchronized关键字来实现线程同步,确保同一时间只有一个线程能访问特定的代码块。此外,还有Lock接口和相关实现,如ReentrantLock,提供更灵活的锁控制。 5. volatile关键字 volatile关键字用于确保...
- 内部锁通过`synchronized`关键字实现,可以应用于方法或代码块。 - `synchronized`关键字确保同一时刻只有一个线程能访问该方法或代码块。 - 集群环境下应避免使用`synchronized`来实现不同任务之间的信息同步...
#### 四、Java线程同步机制 **4.1 synchronized关键字** `synchronized`关键字用于保证线程间的可见性和有序性。它可以修饰方法或者代码块,确保任何时候只有一个线程可以访问被锁定的对象或代码块。 ```java ...
Java线程有10个优先级,`Thread.MIN_PRIORITY` (1)到`Thread.MAX_PRIORITY` (10),默认优先级是`Thread.NORM_PRIORITY` (5)。不过,线程优先级对实际调度的影响并不大,因为大多数操作系统不支持优先级调度。 6. *...
1. synchronized关键字:可以用于方法或代码块,确保同一时间只有一个线程可以执行特定的代码。 2. volatile关键字:保证变量在所有线程中的可见性,防止线程缓存导致的数据不一致。 3. Lock接口和ReentrantLock类:...
- **synchronized关键字**:用于控制多线程对共享资源的访问,确保同一时间只有一个线程能执行特定代码块。 - **volatile关键字**:保证共享变量的可见性和有序性,避免线程间的脏读。 - **Lock接口与...
Java线程是Java编程中的重要概念,特别是在处理并发和多任务执行时不可或缺。`Thread`类是Java中用于实现线程的基本接口,它位于`java.lang`包中。本实例将深入探讨`Thread`类的使用,这对于初学者掌握多线程编程至...
### JAVA线程深入了解 #### 一、JAVA线程启动方式详解 ##### 1. 利用`Thread`类的子类启动线程 在Java中,可以通过继承`Thread`类来创建一个新的线程。这种方式相对直观,易于理解。具体做法是创建一个`Thread`类...
以下是一个简单的Java线程示例: ```java public class MyThread extends Thread { public void run() { // 线程执行的代码 } public static void main(String[] args) { MyThread thread = new MyThread(); ...
在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程将深入探讨Java多线程的各个方面。 首先,理解线程的基本概念至关重要。线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个线程。...
1. `synchronized`关键字:用于控制对共享资源的访问,确保同一时刻只有一个线程能执行特定代码块。 ```java public synchronized void someMethod() { // 共享资源操作 } ``` 2. `wait()`、`notify()`和`...
本篇内容将围绕Java线程的基础知识、创建方式、生命周期以及线程同步等核心概念进行深入探讨。 #### 一、Java线程基础知识 1. **线程与进程的区别**:线程是进程中可独立调度和执行的基本单元,而进程则是资源分配...
4. wait(), notify(), notifyAll()方法:在synchronized代码块或方法中使用,用于线程间通信。 五、线程池 Java Executor框架提供了线程池管理,通过ExecutorService接口和ThreadPoolExecutor类实现。线程池可以...
在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口或者继承`Thread`类。 首先,让我们从创建线程开始。当你有一个实现了`Runnable`接口的类时,你可以创建一个`Thread`对象并传入你的`Runnable`实例,如...