synchronized  通常用来形容一次方法的调用,调用一旦开始,调用者必须等到方法调用返回后,才能继续执行后续的操作。

1.demo

package demo1;
public class MyThread extends Thread {
private int count = 5;
@Override
public void run() {
count--;
System.err.println("∽"+currentThread().getName()+"count:"+this.count);
}
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread,"myThread-1");
Thread t2 = new Thread(myThread,"myThread-2");
Thread t3 = new Thread(myThread,"myThread-3");
Thread t4 = new Thread(myThread,"myThread-4");
Thread t5 = new Thread(myThread,"myThread-5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start(); }
}
结果输出:

        ∽myThread-1count:2
        ∽myThread-4count:1
        ∽myThread-2count:2
        ∽myThread-3count:2
        ∽myThread-5count:0

 

描述:5个线程都会去对这个 count  变量进行操作,但是出现了重复的数据,说明没有进行同步、共享。

2.demo:使用 synchronized 关键字

package demo1;

public class MyThread extends Thread {

    private  int count = 5;
@Override
public synchronized void run() {
count--;
System.err.println("∽"+currentThread().getName()+"count:"+this.count);
}
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread,"myThread-1");
Thread t2 = new Thread(myThread,"myThread-2");
Thread t3 = new Thread(myThread,"myThread-3");
Thread t4 = new Thread(myThread,"myThread-4");
Thread t5 = new Thread(myThread,"myThread-5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start(); }
} 结果输出:

      ∽myThread-1count:4
      ∽myThread-3count:3
      ∽myThread-2count:2
      ∽myThread-4count:1
      ∽myThread-5count:0

 

描述:输出的结果没有重复的,说明同步生效了。

  1.当多个线程都去访问 MyThread 的run 方法的时候,都会以队列的的方式去进行访问处理(CPU的分配)。

  2.一个线程要执行 synchronized 方法修饰的代码块:都会去尝试去获取锁(object的锁),如果拿到锁,则执行 synchronized 代码的内容;

   如果拿不到,则会不断的去尝试获取这把锁,一直到拿到为止 (多个线程去尝试获取这把锁,就行形成竞争、排队的问题)。

synchronized 线程同步的更多相关文章

  1. java多线程之synchronized(线程同步)

    一.线程同步,主要应用synchronized关键字: public class TraditionalThreadSynchorinzed { public static void main(Str ...

  2. java synchronized 线程同步机制详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  3. Java synchronized 线程同步

    同步方法 class MyTheard4 implements Runnable{ private int ticket; public MyTheard4(int ticket) { this.ti ...

  4. synchronized 线程同步-类级别锁定

    1.demo 说明:代码中通过 printNum 方法传入参数判断 a.b 分别对 num 这个参数的值进行了修改. package demo1; import sun.applet.Main; pu ...

  5. Java线程(二):线程同步synchronized和volatile

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...

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

    卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1, ...

  7. 线程同步 synchronized 同步代码块 同步方法 同步锁

    一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...

  8. Java多线程:线程同步与关键字synchronized

    一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...

  9. 剑指Offer——线程同步volatile与synchronized详解

    (转)Java面试--线程同步volatile与synchronized详解 0. 前言 面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现 ...

随机推荐

  1. 小白成长记-----python实现注册的小程序

    # 3.写一个注册的程序,输入username,密码,# 密码确认,输入的账号和密码不能为空,两次输入密码必须一致,# 用户名不能重复,错误次数四次 .注册成功提示成功# 把注册账号密码信息的写到文件 ...

  2. hdu 3416(最大流+最短路)

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. WordPress主题设置插件,让你的站点有电脑、手机双主题

    我们建站的时候总是会优先考虑自适应的主题,但是与之对应,免费的自适应主题都调用国外公共资源,访问速度不太理想.加上wordpress未经优化之前,本身也没有极高的访问效率.所以大家可以下载这款“主题设 ...

  4. PHP数组转对象,对象转数组

    废话不多,直接上代码: <?php class object_array{ //数组转对象 public static function array_to_object($e){ if(gett ...

  5. AC日记——「HNOI2017」单旋 LiBreOJ 2018

    #2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  6. AC日记——送花 洛谷 P2073

    送花 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...

  7. CentOS7配置sentinel高可用redis

    redis哨兵:用于管理和实现多个redis组实现高可用,sentinel哨兵只监控主节点,因为主节点上有所有的从节点信息,当master节点发生故障,sentinel之间会进行投票选举一个slave ...

  8. 关于render函数的总结

    一般情况下封装一个导航组件的写法 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  9. java 连接 kerberos 认证的 HBase 和 HDFS

    这是两个功能,都很简单就写一块了.. 简单到什么程度呢,简单到只贴代码就可以了... HBase package com.miras.data; import org.apache.hadoop.co ...

  10. SOAP消息的结构

    概述 介绍SOAP报文的结构,以及获取的方式. 正文 1.其实发送的是SOAP消息 在前面讲述过使用Eclipse的工具Web Services Explorer发送请求.在Actions中填写请求参 ...