首页后端开发JAVAjava线程和进程(二)

java线程和进程(二)

时间2023-04-05 16:54:01发布访客分类JAVA浏览839
导读:synchronized关键字用法:synchronized方法可以在方法前加上synchronized关键字,实现对整个方法的同步。示例:public class Counter { private int count = 0;...

synchronized关键字用法:

synchronized方法

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

示例:

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());

    }

}

输出结果:

0

synchronized块

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

示例:

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());

    }

}
    

输出结果:

0

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

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

调度

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

内存

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

资源开销

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

安全性

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

总结

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

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

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

java

若转载请注明出处: java线程和进程(二)
本文地址: https://pptw.com/jishu/1878.html
java同步和锁(一) java线程和进程(一)

游客 回复需填写必要信息