Tag: 锁定

Java中的并发字节数组访问,尽可能少的锁

我正在尝试减少分段数据的锁定对象的内存使用量。 在这里和这里看我的问题。 或者假设你有一个字节数组,每16个字节可以(de)序列化为一个对象。 我们将其称为行,行长度为16个字节。 现在,如果您从编写器线程修改这样的行并从多个线程读取,则需要锁定。 如果你的字节数组大小为1MB(1024 * 1024),这意味着65536行和相同数量的锁。 这有点太多了,我还需要更大的字节数组,我想把它减少到大致与线程数成比例的东西。 我的想法是创造一个 ConcurrentHashMap concurrentMap; 其中Integer是行索引,在线程“输入”行之前,它会在此映射中放置一个锁定对象(从这个答案中得到了这个想法)。 但无论我怎么想,我都找不到真正的线程安全的方法: // somewhere else where we need to write or read the row LockHelper lock1 = new LockHelper(); LockHelper lock = concurrentMap.putIfAbsent(rowIndex, lock1); lock.addWaitingThread(); // is too late synchronized(lock) { try { // read or write row at rowIndex eg writing like […]

什么是类级别,对象级别,显式和内部锁定?

我一直在经历Javamultithreading概念。 我经历的越多,我就越困惑。 现在我不理解Java中的类级别,对象级别,显式锁定和内部锁定之间的差异。 有人可以让我知道这是什么? 另外,如果我能得到一些例子来理解,那对我来说非常有帮助。

使用request.getSession()作为锁定对象?

我有一些获取和设置会话属性的java代码: Object obj = session.getAttribute(TEST_ATTR); if (obj==null) { obj = new MyObject(); session.setAttribute(obj); } 为了使这段代码成为线程安全的,我想将它包装在一个synchronized块中。 但是我用什么作为锁定对象呢? 使用会话是否有意义? synchronized (session) { Object obj = session.getAttribute(TEST_ATTR); if (obj==null) { obj = new MyObject(); session.setAttribute(obj); } }

双重检查锁定物品

我正在阅读这篇关于“双重检查锁定”的文章,并且在文章的主题之外我想知道为什么在文章的某些方面作者使用下一个成语: 清单7.尝试解决乱序写入问题 public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 Singleton inst = instance; //2 if (inst == null) { synchronized(Singleton.class) { //3 inst = new Singleton(); //4 } instance = inst; //5 } } } return instance; } 我的问题是:有没有理由将两次代码同步锁定同一个锁? 有这个任何目的吗? 提前谢谢了。

在我的例子中,Synchronized和Lock有什么区别?

我写了一个简单的代码来使用Lock和synchronized来模拟并发。 源代码如下: Task类包含一个名为doSomething()的方法来打印线程名称并执行已用时间。 import java.util.Calendar; public class Task { public void doSomething() { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } StringBuilder sb = new StringBuilder(); //Thread Name sb.append(“Thread Name: “).append(Thread.currentThread().getName()); //Timestamp for the executing sb.append(“, elaspsed time: “).append(Calendar.getInstance().get(13)).append(” s “); System.out.println(sb.toString()); } } TaskWithLock类 import java.util.concurrent.locks.Lock; import […]

notify / notifyall是否释放正在进行的锁定

我有点担心等待并通知/ notifyAll。 我知道每个java对象都有一个锁。 我知道等待将释放其他线程的锁。 通知/ notifyall怎么样? notify / notifyAll会释放它为其他线程持有的锁吗?

为什么用Java检查双重检查锁定?

据说,除了long或double字段外,字段赋值总是primefaces的。 但是,当我读到为什么双重检查锁定被破坏的解释时,它说问题在于赋值操作: // Broken multithreaded version // “Double-Checked Locking” idiom class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) { synchronized(this) { if (helper == null) { helper = new Helper(); } } } return helper; } // other functions and members… } 线程A注意到该值未初始化,因此它获得锁定并开始初始化该值。 由于某些编程语言的语义,允许编译器生成的代码在A完成初始化之前更新共享变量以指向部分构造的对象。 线程B注意到共享变量已初始化(或显示),并返回其值。 因为线程B认为该值已经初始化,所以它不会获得锁定。 如果B在B看到A完成的所有初始化之前使用该对象(因为A尚未完成初始化或者因为对象中的某些初始化值尚未渗透到内存B使用(缓存一致性)) […]

Java Concurrency in Practice – 示例14.12

// Not really how java.util.concurrent.Semaphore is implemented @ThreadSafe public class SemaphoreOnLock { private final Lock lock = new ReentrantLock(); // CONDITION PREDICATE: permitsAvailable (permits > 0) private final Condition permitsAvailable = lock.newCondition(); @GuardedBy(“lock”) private int permits; SemaphoreOnLock(int initialPermits) { lock.lock(); try { permits = initialPermits; } finally { lock.unlock(); } } /* other code omitted…. […]

multithreadingJava应用程序中的SQLite

我编写了一个java应用程序,偶尔将事件从多个线程记录到SQLite数据库。 我注意到我可以通过同时生成少量事件来相对容易地触发SQLite的“数据库锁定”错误。 这促使我编写了一个模拟最坏情况行为的测试程序,我很惊讶SQLite在这个用例中表现得有多糟糕。 下面发布的代码只是将五条记录添加到数据库中,首先按顺序获取“控制”值。 然后同时添加相同的五个记录。 import java.sql.*; public class Main { public static void main(String[] args) throws Exception { Class.forName(“org.sqlite.JDBC”); Connection conn = DriverManager.getConnection(“jdbc:sqlite:test.db”); Statement stat = conn.createStatement(); stat.executeUpdate(“drop table if exists people”); stat.executeUpdate(“create table people (name, occupation)”); conn.close(); SqlTask tasks[] = { new SqlTask(“Gandhi”, “politics”), new SqlTask(“Turing”, “computers”), new SqlTask(“Picaso”, “artist”), new SqlTask(“shakespeare”, “writer”), […]

Java:线程安全的RandomAccessFile

经过一些严肃的googleing后,我发现RandomAccessFile-class不是线程安全的。 现在我可以使用一个信号量锁定所有读写但我不认为它表现得非常好。 理论上,应该可以一次执行多次读取和一次写入。 我怎么能用Java做到这一点? 有可能吗? 谢谢!