Tag: 并发

在thread.start之前发生的所有事情都可以生成调用start的线程吗?

现在已经有很好的答案已经在stackoverflow上,但他们没有给我我想要的明确答案。 假设你有一个方法 Dosomething(); doAnother(); int x = 5; Runnable r = new Runnable(){ public void run(){ int y = x; x = 7; System.out.println(z);} } new Thread(r).start() 现在同时这个方法正在运行,在调用thread.start之前,一些全局非易失性变量z从4变为5。 由于z发生在thread.start之前,程序是否会保证打印5? 另外,如果我们以这种方式讨论它,那么可以肯定地说thread.start()永远不会被重新排序。 根据被调用的那个线程的意义开始,就好像到那一点的一切都是顺序的。 比如说我们有 int k = 8; new Thread(() -> {}).start() 现在……在该线程的视角中,无论是首先调用start还是分配k,都不会产生影响。所以这可以重新排序,但是因为在保证之前发生了,这是不可能的? java规范没有说明这一点的强烈声明。 相反它说 当一个语句调用Thread.start()时,每个语句都与该语句有一个before-before关系 然而,k = 8并不是在与该陈述的关系之前发生的…… 我甚至不确定他们的意思是在与start方法的关系之前发生了什么事情,除非您使用相同的监视器锁定 synchronized(this){ int k = 8;} synchronized(this) { […]

并发使用JaxWsPortProxyFactoryBean

我正在使用JaxWsPortProxyFactoryBean (Spring 3.1.2)来访问远程Web服务。 在文档中,我找不到有关JaxWsPortProxyFactoryBean并发使用的任何内容。 是否允许与线程同时使用它? 如果是这样,是否可以动态更改enpoint地址,以便不同的线程可以为同一个JaxWsPortProxyFactoryBean使用不同的端点?

限制对方法的并发访问

我有限制并发访问方法的问题。 我有一个方法MyService ,可以在很多时候从很多地方调用。 此方法必须返回一个String ,应根据某些规则进行更新。 为此,我有一个updatedString类。 在获取String之前,它确保更新String ,如果没有,则更新它。 许multithreading可以同时读取String但是如果它已经过时,只有一个应该同时更新String 。 public final class updatedString { private static final String UPstring; private static final Object lock = new Object(); public static String getUpdatedString(){ synchronized(lock){ if(stringNeedRenewal()){ renewString(); } } return getString(); } … 这很好用。 如果我有7个线程获取String,它保证,如果需要,只有一个线程正在更新String。 我的问题是,将所有这些都static是一个好主意吗? 为什么不呢? 它快吗? 有一个更好的方法吗? 我读过这样的post: 什么案例需要Java中的同步方法访问? 这表明静态可变变量不是一个好主意,也不是静态类。 但我看不到代码中的任何死锁或更好的有效解决方案。 只有某些线程必须等到String更新(如果需要)或等待其他线程离开同步块(这会导致一个小的延迟)。 如果该方法不是static ,那么我有一个问题,因为这不起作用,因为synchronized方法仅适用于线程正在使用的当前实例。 同步方法也不起作用,似乎是锁具实例特定而不是特定于类。 […]

如何检查是否有任何等待条件变量的线程?

我有条件变量名为cond。 如果有任何线程等待cond,是否有任何方法可以给我真或假? 我需要类似的东西:Boolean cond.isAwaitingSetEmpty() 感谢帮助

在MySQL中严格自动递增值

我必须使用严格的顺序ID为表(行)中的每个元素创建一个MySQL InnoDB表。 ID中不能有任何间隙 – 每个元素必须具有不同的ID,并且必须按顺序分配。 并发用户在此表上创建数据。 我遇到了MySQL“自动增量”行为,如果事务失败,则不使用PK号,留下间隙。 我已经阅读了在线复杂的解决方案,这些解决方案并没有说服我和其他一些没有真正解决我的问题( 在MySQL / InnoDB中模拟自动增量, 在同步的mysql服务器上设置手动增量值 ) 我想最大限度地提高并发性。 我不能让用户在桌面上写字并等待很长时间。 我可能需要对表进行分片…但仍然保持ID计数。 表中元素的顺序并不重要,但ID必须是顺序的(即,如果在另一个元素之前创建元素不需要具有较低的ID,则不允许在ID之间存在间隙)。 我能想到的唯一解决方案是使用额外的COUNTER表来保持计数。 然后用空的“ID”(不是PK)在表中创建元素,然后锁定COUNTER表,获取数字,将其写在元素上,增加数字,解锁表。 我认为这样可以正常工作,但有一个明显的瓶颈:在锁定期间,没有人能够写任何ID。 此外,如果持有表的节点不可用,则是单点故障。 我可以创建一个“主人”吗? 复制但我不确定这种方式我是否冒冒险使用过时的ID计数器(我从未使用过复制)。 谢谢。

有多少个线程可以同时调用对象的非同步方法?

所以,假设我有一个带有方法m的类X. 方法m 不是同步的,它不需要,因为它不会真正改变X类型的对象x的状态。 在某些线程中,我调用这样的方法:xm()。 所有这些线程都使用相同的对象x。 这个方法(方法m)可以同时在对象x上调用多少个线程? 可能是这个方法被调用,比方说,100个线程是我的应用程序的瓶颈? 谢谢。

这个线程程序每次都会显示不同的答案

这是一个Java程序,用于查找1-500000中具有最大除数的数字。 public class Medium2 { static int count1 = 1; static int count2 = 1; static int big_count = 0; static int big = 0; 主要方法 public static void main(String[] args) { Runnable runnable1 = new Runnable() { public void run() { 实施在这里 for (int num = 1; num <= 500000; num++) { for (int […]

如何解释primefaces行为?

什么是primefaces行为以及它们为什么是必要的? 另外,如何在Java中实现primefaces操作? 我的理解是,在编程中,primefaces动作是一种有效地发生在一起的动作。 primefaces动作不能在中间停止它完全发生或根本不发生。 例如,在线订购需要两个操作的机票:付款和座位预订。 潜在的乘客必须。 支付和预留座位,或 既不付钱也不预定座位

Netty Comet异步请求超时

我正在尝试使用Jboss Netty创建长轮询Comet。 如何配置30秒的时间? 文件后面: @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast(“decoder”, new HttpRequestDecoder()); pipeline.addLast(“encoder”, new HttpResponseEncoder()); pipeline.addLast(“handler”, new HTTPRequestHandler()); Timer timer = new HashedWheelTimer(); pipeline.addLast(“timeout”, new IdleStateHandler(timer, 30, 30, 0)); return pipeline; 但它不起作用,我的要求永远持续下去。 怎么解决这个问题? 这是否意味着我需要实现Callable ,然后使用timeout参数调用Future.get并在发生TimeOutException时终止请求? 那我应该使用Future吗? 还有其他方法吗? 码: FutureExecutor executor = FutureExecutor.getInstance(); @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) […]

哪个更快? 更多可运行的工作更少,或者更少的可运行工作? (ExecutorService的)

我试图弄清楚如何从multithreading应用程序中获得最大性能。 我有一个我创建的线程池,如下所示: ExecutorService executor = Executors.newFixedThreadPool(8); // I have 8 CPU cores. 我的问题是,我应该将工作分成只有8个runnables / callables,这与线程池中的线程数相同,还是应该将它分成1000000 runnables / callables呢? for (int i = 0; i < 1000000; i++) { Callable worker = new MyCallable(); // Each worker does little work. Future submit = executor.submit(worker); } long sum = 0; for (Future future : list) sum += […]