java锁的问题

问题描述

代码如下:package com;public class method {private static method m = null;private static byte[] b = new byte[0];private method(){}public static method getInstance(){if(m==null){ m = new method();}return m;}public void print1(){synchronized (b) {for(int i = 0;i<1220;i++){ System.out.println(Thread.currentThread().getName()+i);}}}public void print2(){synchronized (b) {for(int i = 0;i<1220;i++){System.out.println(Thread.currentThread().getName()+i);}}}}package com;public class test {public static void main(String[] args) {test t=new test();t.init();}public void init(){Runnable r = new thread1();Thread t = new Thread(r,"A");t.start();Runnable r1 = new thread2();Thread t1 = new Thread(r,"B");t1.start();}public class thread1 implements Runnable{public void run() {method m = method.getInstance();m.print1();}}public class thread2 implements Runnable{public void run() {method m = method.getInstance();m.print2();}}}问题:如若synchronized (b)中的b是static 则执行的结果是AB按顺序出现,若b是非static则AB交替出现,若b换成thisAB也是交替出现。谁能给我解释下为什么吗,method类中的两个方法里的锁不是指向同一个对象吗。谢谢

解决方案

哦 那我没仔细看。。。你在public static method getInstance()这个函数前加synchronized,这样才保证是singleton,只有一个mpublic synchronized static method getInstance()
解决方案二:
另外 线程交替执行貌似也是正常的 因为如果不手动控制,线程本身就不一定是顺序执行的
解决方案三:
synchronized锁的是对象,这个楼主应该明白的吧b是static的话thread1 thread2里面 method m = method.getInstance(); 返回的m里是同一个b啊不是static的话 m里各有一个b啊,所以运行print1,print2的时候 锁的就不是同一个了啊

时间: 2024-07-31 00:31:26

java锁的问题的相关文章

synchronized java锁-synchronized java锁

问题描述 synchronized java锁 synchronized(xxxxx.class){ xxxx; } 跟 private static String aaaaaa = new String("aaaaaaa"); synchronized(aaaaaa){ xxxx; } 这两个有什么区别?

java 锁

什么是线程安全? 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的.代码本省封装了所有必要的正确性保障手段(互斥同步等),令调用者无需关心多线程的问题,更无需自己实现任何措施来保证多线程的正确调用. 如何来实现线程安全? 我们应用最多的就是互斥锁: java的互斥锁的主要有synchronized,和JUC 中的lock两种: 加锁的原理是 对象

java锁的种类以及辨析(一):自旋锁

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 1.自旋锁 自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区.如下 01 public class SpinLock { 02   03   private

Java锁的种类以及辨析(二):自旋锁的其他种类

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 2.自旋锁的其他种类 上篇我们讲到了自旋锁,在自旋锁中 另有三种常见的锁形式:TicketLock ,CLHlock 和MCSlock Ticket锁主要解决的是访问顺序的问题,主要的问题是在多核cpu上

Java锁的种类以及辨析(四):可重入锁

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 四.可重入锁: 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响

Java锁的种类以及辨析(三):阻塞锁

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 三.阻塞锁: 阻塞锁,与自旋锁不同,改变了线程的运行状态. 在JAVA环境中,线程Thread有如下几个状态: 1,新建状态 2,就绪状态 3,运行状态 4,阻塞状态 5,死亡状态 阻塞锁,可以说是让线程进入阻塞状态进

Java锁的种类以及辨析

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA中常见的锁以及其特性,为大家答疑解惑. 1.自旋锁 2.自旋锁的其他种类 3.阻塞锁 4.可重入锁 5.读写锁 6.互斥锁 7.悲观锁 8.乐观锁 9.公平锁 10.非公平锁 11.偏向锁 12.对象锁 13.线程锁 14.锁粗化 15.轻量级锁 16.锁消除

Java锁之阻塞锁介绍和代码实例_java

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 阻塞锁 阻塞锁,与自旋锁不同,改变了线程的运行状态. 在JAVA环境中,线程Thread有如下几个状态: 1,新建状态 2,就绪状态 3,运行状态 4,阻塞状态 5,死亡状态 阻塞锁,可以说是让线程进入阻塞状态进行等待

Java锁之可重入锁介绍_java

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 四.可重入锁: 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响. 在JAV

java锁

问题描述 各位大神谁能给个好答案,详细一点的?java有几种锁,没种锁的应用场景是什么? 解决方案 解决方案二:原生的JAVA只有一种锁.concurrent包里分为读锁和写锁.你也可以根据他的接口来实现自己的锁解决方案三:我想知道关于锁的种类,机制,应用场景都是什么,详细一点的.比如:读锁,写锁,悲观锁,乐观锁,对象锁什么的,全面一点的.