首页 > 其他分享 >12月16日

12月16日

时间:2025-01-10 18:37:01浏览次数:1  
标签:12 synchronized 16 lock 同步 full 线程 public

在多线程环境中,多个线程可能会同时访问和修改共享资源,这可能导致数据不一致和竞态条件等问题。为了保证数据的正确性和一致性,需要对线程进行同步和互斥控制。

同步代码块:通过在代码块前加上synchronized关键字,可以将代码块标记为同步代码块。同步代码块需要指定一个锁对象,当线程进入同步代码块时,会尝试获取锁对象的锁,如果锁已被其他线程占用,则当前线程会进入阻塞状态,直到锁被释放。例如:
java
public class Counter {
private int count = 0;

public void increment() {
    synchronized (this) {  // 使用当前对象作为锁对象
        count++;
    }
}

public int getCount() {
    synchronized (this) {
        return count;
    }
}

}
同步方法:通过在方法前加上synchronized关键字,可以将整个方法标记为同步方法。同步方法的锁对象是当前对象(非静态同步方法)或类的Class对象(静态同步方法)。例如:
java
public class Counter {
private int count = 0;

public synchronized void increment() {  // 非静态同步方法
    count++;
}

public static synchronized void staticMethod() {  // 静态同步方法
    // ...
}

}
锁的概念:锁是一种用于控制多个线程对共享资源访问的机制。在Java中,每个对象都有一个与之关联的内部锁(也称为监视器锁或互斥锁),通过synchronized关键字可以获取和释放这个锁。锁的主要作用是确保同一时刻只有一个线程可以执行同步代码块或同步方法,从而避免了多线程并发访问共享资源时可能出现的数据不一致问题。
线程之间的通信是多线程编程中的一个重要方面,它允许线程之间传递信息、协调工作。Java提供了几种线程通信机制,如wait、notify和notifyAll方法,以及Condition接口等。

wait、notify和notifyAll方法:这些方法定义在Object类中,用于实现线程之间的等待和通知机制。wait方法使当前线程进入等待状态,并释放锁对象的锁,直到其他线程调用notify或notifyAll方法唤醒等待的线程。notify方法唤醒一个正在等待锁对象的线程,而notifyAll方法唤醒所有正在等待锁对象的线程。例如:
java
public class Buffer {
private boolean full = false;
private Object lock = new Object();

public void put() {
    synchronized (lock) {
        while (full) {
            try {
                lock.wait();  // 等待,释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 放入元素
        full = true;
        lock.notifyAll();  // 唤醒等待的线程
    }
}

public void get() {
    synchronized (lock) {
        while (!full) {
            try {
                lock.wait();  // 等待,释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 获取元素
        full = false;
        lock.notifyAll();  // 唤醒等待的线程
    }
}

}
Condition接口:Condition接口是Java并发包(java.util.concurrent)中提供的另一种线程通信机制,它比wait、notify和notifyAll方法更加灵活和强大。Condition接口与锁(Lock接口的实现类)配合使用,可以实现更复杂的线程通信场景。例如:
java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Buffer {
private boolean full = false;
private Lock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();

public void put() {
    lock.lock();
    try {
        while (full) {
            notFull.await();  // 等待,释放锁
        }
        // 放入元素
        full = true;
        notEmpty.signalAll();  // 唤醒等待的线程
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

public void get() {
    lock.lock();
    try {
        while (!full) {
            notEmpty.await();  // 等待,释放锁
        }
        // 获取元素
        full = false;
        notFull.signalAll();  // 唤醒等待的线程
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

}

标签:12,synchronized,16,lock,同步,full,线程,public
From: https://www.cnblogs.com/wenbushi-dream/p/18664483

相关文章

  • 12月12日总结
    今日复习了线性表中顺序表的相关操作初始化:voidInitList(SqList&L){ //申请存储空间 L.data=(int*)malloc(InitSize*sizeof(int)); L.length=0; L.MaxSize=InitSize;}插入:boolListInsert(SqList&L,inti,inte){ if(i<1||i<L.length+1) //判断i的范围是否有......
  • 12月17日
    今天主要学习了Java中的输入输出(I/O)系统,这是Java编程中用于处理数据输入和输出的核心机制。I/O系统提供了丰富的类和接口,用于读取和写入文件、网络数据等,是实现程序与外部世界交互的重要工具。JavaI/O框架主要分为两个部分:字节流(ByteStreams)和字符流(CharacterStreams)。字节......
  • 12月13日总结
    今日深入学习了数据结构中的单链表,收获颇丰。在概念理解上,单链表是由一系列节点组成的数据结构,每个节点包含数据域和指向下一节点的指针域,通过指针依次相连,形成一条线性链状结构。与数组相比,它的优势在于动态分配内存,无需预先指定大小,能灵活地进行插入和删除操作。学习过程中,重......
  • 12月18日
    今天继续学IO流文件读取(FileReader)FileReader用于从文件中读取字符数据。例如,读取一个文本文件:javaimportjava.io.FileReader;importjava.io.IOException;publicclassFileReaderExample{publicstaticvoidmain(String[]args){try(FileReaderfr=newFileReade......
  • 12月19日
    今日深入学习了Java中的网络编程,这是Java编程中用于实现网络通信的重要部分。通过网络编程,Java程序可以与其他计算机上的程序进行数据交换和通信,实现客户端-服务器(C/S)架构和分布式系统。Java网络编程主要涉及两个方面:套接字(Socket)编程和URL处理。套接字是网络通信的基础,它提供了......
  • 12月20日
    今天继续学习网络编程多线程服务器在实际应用中,服务器通常需要同时处理多个客户端连接。多线程服务器可以通过为每个客户端连接创建一个新线程来实现。例如:javaimportjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassMultiThreadedServer{......
  • 12月21日
    今天主要学习了Java中的反射(Reflection)机制,这是Java语言提供的强大功能,允许程序在运行时动态地获取类的信息、创建对象、调用方法和访问字段等。反射机制为Java程序提供了极大的灵活性和动态性,是实现框架和库等高级功能的基础。反射是指在程序运行时,能够获取任意一个类的属性和方......
  • 12月10日
    今日深入研读了Java中的异常处理机制,这是编程中极为关键的一环,它能有效保障程序的健壮性与稳定性,确保程序在遭遇错误时能够合理地响应并尽可能地继续执行。异常是指程序运行过程中出现的不正常情况,如除数为零、数组越界等。Java通过异常处理机制来应对这些突发状况。异常处理主要......
  • 12月11日
    今日继续深入研读了Java中的异常处理机制Java中的异常主要分为两大类:受检查异常(checkedexceptions)和非受检查异常(uncheckedexceptions)。受检查异常:是指那些在编译时需要显式处理的异常,如IOException、SQLException等。这类异常通常与程序的运行环境相关,如文件操作、网络通信等......
  • 12月13日
    今天主要学习了Java中的集合框架,这是Java编程中用于存储和管理对象集合的强大工具,它提供了一系列灵活的数据结构,能够满足不同的数据存储和操作需求。Java集合框架是一个统一的架构,用于表示和处理对象集合。它主要包含三大接口:Collection、Map以及它们的子接口和实现类。Collecti......