tomcat-java synchronized 线程

问题描述

java synchronized 线程

目前的我的这个同步方法是这样的,我查阅的一些资料是解释:
synchronized()作用是:防止多个线程同一时间调用此代码块或者方法.

如果我多台服务器上的 tomcat ,在执行到这个方法的时候是什么情况?

解决方案

Synchronized只能锁定当前tomcat的方法;

因为其实现机制是可用共享的堆内存空间,多个tomcat之间就各用各的堆内存空间,所以在多个tomcat之间用同步是办不到实际的原子性操作的;

解决方法:
1.在数据库层面进行锁定,避免脏数据的产生;
2.将共享的变量或操作放置于一个中央控制服务器中,这样也能办到共享数据的原子性

解决方案二:

看到一个关于Java锁机制Synchronized很贴切的比喻,忍不住抄袭过来:
?
打个比方:一个object就像一个大房子,大门永远打开。房子里有很多房间(也就是方法)。这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。
在此我们先来明确......
答案就在这里:java线程锁机制Synchronized

时间: 2024-11-13 02:24:20

tomcat-java synchronized 线程的相关文章

JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式

package sell_ticket; public class ThreadTicket { public static void main(String[] args) { MyThread m = new MyThread(); Thread t1 = new Thread(m); Thread t2 = new Thread(m); Thread t3 = new Thread(m); t1.start(); t2.start(); t3.start(); } } class MyTh

Java创建线程池两种不同方法的比较

用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源.要用到多线程的等方面,也就免不了对线程的控制或用到线程池.   我在做我们现在的那一个抓取框架的时候,就曾经用过java.util.concurrent.ExecutorService作为线程池,关于ExecutorService的使用代码大概如下: java.util.concurrent.Executors类的API提供大量创建连接池

JAVA创建线程池

线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或 手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制 线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等 待进程,线程池的这一资源处于等待.当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开 始运行了:否则进入等待队列. 为什么要用线程池: 减少了创建和销毁线程的次数,每个工作 线程都可以被重复利用,可执行

java 进程死锁-java 模拟线程死锁实验

问题描述 java 模拟线程死锁实验 我想两个线程一直在售票知道票卖光,但是用while()控制循环后出现 售票2进入共享区 当前没有车票可以出售! 售票2进入共享区 当前没有车票可以出售! 售票2进入共享区 ..... 具体代码如下 package com; public class SaleThread extends Thread{ private String name; ShareResource shareresource; public SaleThread(){} public

总结Java中线程的状态及多线程的实现方式_java

线程的状态线程状态图: 说明: 线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行.3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意的是,线

java关于线程同步的问题

问题描述 java关于线程同步的问题 package 线程.TestTeread_5; /* push和pop增加减少数组元素, 我的问题是: 为什么去掉push和pop的synchronized修饰关键词时,会报如下错误 异常: Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at 线程.TestTeread_

java中线程同步,线程让步,线程休眠的区别和联系是什么

问题描述 java中线程同步,线程让步,线程休眠的区别和联系是什么 java中线程同步,线程让步,线程休眠的区别和联系是什么 线程的本质还是一个运行中的类, 解决方案 线程同步:是保证多线程安全访问竞争资源的一种手段,java中常用的是加锁机制即synchronized同步代码块实现的. 线程让步的方法是yield(),休眠方法是sleep().sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程. 两者的区别在于:s

Java中线程用法总结_java

本文实例总结了Java中线程用法.分享给大家供大家参考.具体分析如下: 1.线程是基本调度单元.共享进程的资源,如内存和文件句柄.但有自己的pc(程序计数器),stack(线程栈)及本地变量 2.线程的优势: a) 充分利用多处理器 b) 可以简化模型.特定任务给特定线程.如servlets及rmi等框架. c) 对异步事件的简单处理.如socket,nio使用更复杂.而现在的操作系统支持更大数量的线程. d) 界面的更佳响应 3.内部锁:synchronized块.互斥.可重入(reentra

java synchronized关键字的用法_java

0.先导的问题代码     下面的代码演示了一个计数器,两个线程同时对i进行累加的操作,各执行1000000次.我们期望的结果肯定是i=2000000.但是我们多次执行以后,会发现i的值永远小于2000000.这是因为,两个线程同时对i进行写入的时候,其中一个线程的结果会覆盖另外一个. public class AccountingSync implements Runnable { static int i = 0; public void increase() { i++; } @Overr