线程同步关键字synchronized的作用

线程和进程的区别:

 线程:是进程内部中的单一顺序控制流,一个进程拥有多个线程,多个线程共享一个进程的内存空间。 

 进程:是指一种“自包容”的运行程序,由操作系统直接管理。直接运行。有直接的地址空间,每个进程以开始都会消化内存。

线程同步:当二个或二个以上的进程同时访问一个资源时,为了保护资源的数据安全,只允许同一时间一个进程的访问,别的进程需要等待该进程放弃这个资源使用权时才能继续访问。

用一个列子来说明线程同步到底是怎么回事。

package com.project.thread;
import java.util.Vector;
import javax.swing.JOptionPane;
public class Bank {
    private int money=2000;
    public  void getMoney(int m){
        if(this.money<m){
            System.out.println("余额超支");
            return;
        }
       try {
        Thread.sleep(1000);
        this.money-=m;
        System.out.println("取走"+m+"余额"+this.money);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
    public static void main(String[] args) {
        Bank b=new Bank();
        Uesr u1=new  Uesr(b,1500);
        Uesr u2=new  Uesr(b,1600);
    }
}
class Uesr extends Thread {
    private Bank bank;
    private int money;
    public Uesr(Bank bank, int money) {
        this.bank = bank;
        this.money = money;
        this.start();
    }
    public void run(){
        bank.getMoney(money);
}
}

上面代码运行时会出现以下的结果:

取走1500余额-1100
取走1600余额-1100

这是因为第一个线程在进行休眠的时候,第二个线程会访问这个资源(bank),因此只要你每次取钱不超过2000,不管余额是多少都能取出来。

而在getMoney()加上关键字synchronized会怎样?,其他地方的代码都是一样。

 //synchronized 线程同步安全关键字
    public void getMoney(int m){
        if(this.money<m){
            System.out.println("余额超支");
            return;
        }

运行结果是:

取走1500余额500
余额超支

从结果可以看出来关键字 synchronized的作用是:只允许同一时间一个进程的访问,别的进程需要等待该进程放弃这个资源使用权时才能继续访问。下个进程访问时候,money属性值是前一个进程访问后修改的值,如果大于了这个值那么就取不出来。



原文地址:https://www.cnblogs.com/dmp90/p/9042993.html

时间: 2024-10-27 18:36:21

线程同步关键字synchronized的作用的相关文章

Java线程同步(synchronized)——卖票问题

卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1,当某个线程执行了synchronized(object)语句后,object对象的标志位变为0状态,直到执行完整个synchronized语句中的代码块后,该对象的标志位又回到1状态. 当一个线程执行到synchronized(object)语句的时候,先检查object对象的标志位,如果为0状态,

同步关键字synchronized

同步关键字synchronized 同步关键字synchronized使用简洁,代码可维护性好.在JDK6中,性能也比早期的JDK有很大的改进.如果可以满足程序要求,应该首先考虑这种同步方式. 关键字synchronized一个最为常用的用法是锁定一个对象的方法: public synchronized void method() {} 此时,当method()方法被调用时,调用线程必须首先获得当前对象的锁,若当前对象锁被其他线程持有,则调用线程会等待,方法结束后,对象锁会被释放.以上方法等价于

java的线程同步机制synchronized关键字的理解

线程同步:               由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: 1)synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.如果 再细的分类,synchronized可作用于instance变量.object reference(对象引用).static函数和clas

JAVA并发编程3_线程同步之synchronized关键字

在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public class Test implements Runnable { private int i = 0; private int getNext() { return i++; } @Override public void run() { // synchronized while (true) { synchro

【java并发】(2) Java线程同步:synchronized锁住的是代码还是对象

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在方法上. 关键是,不要认为给方法或者代码段加上synchronized就万事大吉,看下面一段代码: class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sle

Java中使用同步关键字synchronized需要注意的问题

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在方法上. 关键是,不要认为给方法或者代码段加上synchronized就万事大吉,看下面一段代码: class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sle

java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用

1. synchronized的作用 synchronized类似于win32中的临界区,临界区的作用:对于共享的全局变量,在多个线程并发的情况下,对这样的全局变量的读写就会发生读写的冲突, 使得全局变量的读写,能够以原子的方式被执行,而不是一个线程要读取全局数据时候,由于线程调度,而另一个线程则此时被唤醒,改变了这个全局变量的值, 这样使得读取的线程获得的数据不稳定,所以对于全局变量的读写的代码,我们要使用临界区使得这些代码原子化,此时只要在临界区中的代码,就会以原子方式执行, 而不会由于线程

线程---同步(synchronized)

实现线程同步的一种方式介绍: 思路: 首先,需要被协调的类,先实现线程,并重写run方法 然后,在被协调的类中私有化控制器,控制器实例化,由构造器带入. 其次,由控制器对象具体负责调用. 举例:循环输出A/B/C main: public class Test { public static void main(String[] args) { Controller controller = new Controller(); new A(controller).start();; new B(

【转】线程同步------java synchronized详解

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块.