对于线程加锁synchronized可能存在的误区的解析

使用synchronized之后,并不是说synchronized锁定的方法或者代码块要一次性执行完,才能跳转到其他线程。而是当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。也即是说,即使给某个方法加锁了,如果其他线程访问不是这个方法时,线程依然可以跳转。如下例子:

 1 public class test2{
 2     public static void main(String[] args) {
 3         Thread a=new A2();
 4         Thread b=new B2();
 5         a.start();
 6         b.start();
 7     }
 8 }
 9
10 class A2 extends Thread{
11     public void run(){
12         show1();
13     }
14     public synchronized void show1(){
15         for(int i=0;i<20;i++){
16             System.out.print(i);
17         }
18     }
19 }
20
21 class B2 extends Thread{
22     public void run(){
23         show2();
24     }
25     public synchronized void show2(){
26         for (int i = 0; i < 20; i++) {
27             System.out.print(i);
28         }
29     }
30 }

创建了两个线程,分别访问自己的加锁show方法,最终的结果不一定是两个连续的1-19,我的运行结果如下:

001122334455667788991010111112121313141415161718191516171819

所以synchronized只是对于访问同一方法的不同线程有效。

时间: 2024-10-06 17:24:57

对于线程加锁synchronized可能存在的误区的解析的相关文章

iOS线程加锁

// 加锁 @synchronized (self) { // 在同一时间,只能一个线程执行,但是很耗资源 } // 解锁 关于加锁,这里有一个东西.关于这个语法:@property.每次我们定义 一个属性的时候,会首当其冲的写上nonatomic,这是为什么?请看下面解说: nonatomic与atomic在@property中的不同: 都知道,这两个关键字代表的是同一个东西,只是代表的含义不同.是与线程有关的. nonatomic代表的是:线程是不安全的. atomic代表的是:线程是安全的

关于线程的synchronized,wait,sleep,notify的一段有趣的代码

首先进入正题,来看代码: public class MultiThread { public static void main(String[] args) { new Thread (new Thread1()).start(); try{ Thread.sleep(10); }catch(InterruptedException e){ e.printStackTrace(); } new Thread(new Thread2()).start(); } private static cla

java线程同步-synchronized

什么是"线程同步" ? 所谓线程同步就是若干个线程都需要使用一个 synchronized(同步)修饰的方法,当一个线程使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到这个线程使用完该 synchronized 方法. 在下面的例子中有两个线程,会计和出纳,他俩共同拥有一个账本,她俩都可以使用saveOrTake(int amount)方法对账本进行访问,会计使用saveOrTake(int mount)方法时,向账本上写入存钱记录:

JAVA程序设计(18.2)----- 5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify

这次没有使用 有名内部类 将程序控制数据.执行程序都独立出来了 5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify 代码如下: 1.独立出来的内部控制数据类 package com.lovo.homework02; /** * 类:将内部数据独立出来 方便修改和控制 * @author Abe * */ public class PrintThreadContext { /** * 允许执行的线程的key 初始值为3 (第4条线程) */ publi

Python第四周之多线程和多进程之线程加锁、五车争霸赛

# Information Technology# 摩尔定律 -- 任何买不起的电子产品,在18月后价格会降低一半,甚至更多.# 原因:电子产品每隔18个月,性能会翻翻.# 安迪比尔定律:安迪给你的东西,比尔都会给你拿走.硬件性能起来了,但是软件跟不上.# 所以:当软件更新时,硬件的性能需求将会提升.# 反摩尔定律:一个IT公司如果今天和18个月前卖掉同样多的.同样的产品,它的营业额就要降一半.IT界把它称为反摩尔定律. # 线程加锁import time from threading impo

【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比较简单,但是一定要理解. 有几个概念一定要牢记: 加锁必须要有锁 执行完后必须要释放锁 同一时间.同一个锁,只能有一个线程执行 二.synchronized synchronized的特点是自动释放锁,作用在方法时自动获取锁,任意对象都可做为锁,它是最常用的加锁机制,锁定几行代码,如下: //---

26 多线程(六)——线程安全 synchronized

关键字synchronized可以写在方法和代码块中 写在普通方法中:锁住的对象时this 写在静态方法中:锁住的对象时class 写在代码块中 关于这个synchronized关键字 线程锁会造成性能下降 线程锁用在大的方法中,很影响性能 关于线程锁 除了使用synchronized关键字外,还可以使用另一种线程锁,本文没有收录方法 下面来看一个没有加线程锁的案例:3个线程抢票 package _20191205; /** * 线程不安全: * @author TEDU */ public c

线程的Synchronized锁

1. 多线程可能出现的安全问题 public class Synchronizedtest implements Runnable { int i = 10; //共享变量 @Override public void run() { if( i == 10 ){ System.out.println("i == 10"); sys i++; } } public static void main(String[] args) throws InterruptedException {

jgs--多线程和synchronized

多线程 多线程是我们开发人员经常提到的一个名词.为什么会有多线程的概念呢?我们的电脑有可能会有多个cpu(或者CPU有多个内核)这就产生了多个线程.对于单个CPU来说,由于CPU运算很快,我们在电脑上运行多个软件时,每个软件在CPU上运行很短的时间就会切换成其他软件.由于来回切换的时间很短,我们感觉好像所有的程序都在同时运行,这也是多线程.多线程可以解决较多的用户访问同一个服务时压力过大的问题,可以更充分的利用计算机的性能. 多线程的问题 多线程的好处很多,可是相应的也出现了一些问题.其中最常见