Java多线程同步问题及解决方案示例

原创 忘是亡心i 2024-10-09 18:00 202阅读 0赞

在Java中,多线程同步主要通过以下几种方式实现:

  1. synchronized关键字

    • 修饰方法:synchronized (object) { }
    • 修饰代码块:synchronized (blockLock) { // ... }
  2. wait()和notify()方法

    • 当一个线程需要等待其他线程操作完成时,会调用wait()
    • 如果某个条件满足,就需要唤醒正在等待的线程,调用notify()
  3. Semaphore(信号量)

    • 用于控制同时访问资源的线程数量。
    • 当一个线程需要获取信号量时,如果信号量大于0,则会减1并允许线程进入。

示例:

  1. public class SynchronizedExample {
  2. private final Object lock = new Object();
  3. // 使用 synchronized 关键字修饰方法
  4. public void syncMethod() {
  5. synchronized (lock) { // 同步代码块
  6. System.out.println("Sync Method executing..."); // 执行任务
  7. }
  8. }
  9. // 使用 wait 和 notify 方法实现同步
  10. public class WaitNotifyExample {
  11. private final Object lock = new Object();
  12. private boolean isRunning = true;
  13. public void waitAndNotify() {
  14. while (isRunning) { // 确保线程在运行期间进行操作
  15. synchronized (lock) { // 同步代码块
  16. if (!isRunning) { // 当不再需要运行时通知
  17. System.out.println("Notifying..."); // 输出通知信息
  18. lock.notify(); // 提醒等待的线程
  19. }
  20. }
  21. }
  22. }
  23. public void test() {
  24. new Thread(() -> syncMethod())).start();
  25. new Thread(() -> waitAndNotify())).start();
  26. }
  27. }
  28. public class Main {
  29. public static void main(String[] args) {
  30. SynchronizedExample example = new SynchronizedExample();
  31. example.test(); // 测试同步操作
  32. }
  33. }
  34. }

在这个示例中,SynchronizedExample类中的方法通过synchronized关键字进行同步。同时,还创建了另一个类WaitNotifyExample,其中的waitAndNotify方法使用waitnotify进行同步。

main方法中,我们创建了一个example对象并调用其test方法来测试多线程同步。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读