前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java线程和进程(二)

java线程和进程(二)

原创
作者头像
堕落飞鸟
发布2023-04-04 08:41:05
2620
发布2023-04-04 08:41:05
举报
文章被收录于专栏:飞鸟的专栏

synchronized关键字用法:

synchronized方法

可以在方法前加上synchronized关键字,实现对整个方法的同步。

示例:

代码语言:javascript
复制
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized void decrement() {
        count--;
    }

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

public class Main {
    public static void main(String[] args) {
        Counter c = new Counter();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                c.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                c.decrement();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(c.getCount());
    }
}

输出结果:

代码语言:javascript
复制
0

synchronized块

可以使用synchronized块来实现对一段代码块的同步。synchronized块有一个参数,即要锁定的对象。当多个线程访问同一个锁定对象时,只有一个线程可以执行synchronized块中的代码。

示例:

代码语言:javascript
复制
public class Counter {
    private int count = 0;
    private Object lock = new Object();

    public void increment() {
        synchronized(lock) {
            count++;
        }
    }

    public void decrement() {
        synchronized(lock) {
            count--;
        }
    }

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

public class Main {
    public static void main(String[] args) {
        Counter c = new Counter();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                c.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                c.decrement();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(c.getCount());
    }
}

输出结果:

代码语言:javascript
复制
0

进程(Process)与线程(Thread)的区别

进程和线程都是程序执行的基本单元,它们都可以执行代码、访问内存,但是它们之间有一些区别。

调度

进程和线程都需要操作系统进行调度,但是进程是操作系统分配资源的基本单位,而线程是CPU调度的基本单位。一个进程可以包含多个线程,线程之间共享进程的资源,但是每个线程有自己的执行栈和局部变量,不同的线程可以并行执行,提高了CPU利用率。

内存

进程有自己独立的内存空间,不同的进程之间的内存是隔离的,一个进程的崩溃不会影响其他进程。而线程共享进程的内存空间,同一个进程中的线程可以直接读写进程中的共享变量。

资源开销

创建进程的开销比较大,需要分配独立的内存空间,建立进程控制块等,而创建线程的开销比较小,只需要为线程分配执行栈和局部变量即可。多个线程可以共享进程的资源,所以线程的开销比进程小。

安全性

由于进程之间的内存是隔离的,一个进程的崩溃不会影响其他进程,因此进程比线程更加安全。而线程共享进程的内存空间,如果一个线程访问了非法地址或者崩溃了,可能会影响到其他线程和进程的稳定性。

总结

Java线程是Java中重要的概念之一,Java中使用Thread类和Runnable接口来实现多线程编程。线程同步是多线程编程中需要注意的问题,Java中使用synchronized关键字来实现线程同步。

进程和线程都是程序执行的基本单元,它们之间有一些区别,包括调度、内存、资源开销和安全性等方面。在编写程序时需要根据具体的需求来选择使用进程还是线程,以实现更好的程序性能和安全性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • synchronized方法
  • synchronized块
  • 调度
  • 内存
  • 资源开销
  • 安全性
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档