Только для выделения этого существуют также ReadWriteLocks, доступные в Java, найденном как java.util.concurrent.locks. ReadWriteLock.
В большей части моего использования, я разделяю свою блокировку как 'для чтения' и 'для обновлений'. При простом использовании синхронизируемого ключевого слова все чтения к тому же блоку метода/кода будут 'поставлены в очередь'. Только один поток может получить доступ к блоку когда-то.
В большинстве случаев, Вы никогда не должны волноваться о проблемах параллелизма при простом выполнении чтения. Именно, когда Вы делаете записи, Вы волнуетесь о параллельных обновлениях (приводящий к потерянным из данных) или читающий во время записи (частичные обновления), о котором необходимо волноваться.
Поэтому блокировка чтения-записи имеет больше смысла мне во время многопоточного программирования.
See Math::BigInt
use Math::BigInt;
$x = Math::BigInt->new("3");
print $x ** 333;
Output:
760988023132059809720425867265032780727896356372077865117010037035791631439306199613044145649378522557935351570949952010001833769302566531786879537190794573523
Если вы хотите сделать это для всех целых чисел в вашей программе, вы можете просто добавить:
use bigint;
Если вы хотите сделать это только для некоторых целых чисел, вы может создавать объекты Math :: BigInt .
Также есть bignum и Math :: BigNum , если вы работаете с числами с плавающей запятой.
С такими большими числами у вас может быть больше цифр, чем точность, используемая для хранения чисел. (Увидев простой исполняемый пример, можно было бы решить этот вопрос.)
Если вам действительно нужно увидеть все 150+ цифр, вы должны использовать bigint (для целых чисел), bigrat (для рациональных чисел) и bignum (для чисел с плавающей запятой). числа) модулей.
Для очень маленьких значений см. Следующий код:
my $value = 1e-07; # = 0.0000001
# NOPE
print $value; # prints 1e-07, $value is a number
print sprintf("%f", $value); # prints 0, $value is a number
print sprintf("%.10f", $value); # prints 0.0000001000, $value is a number
$value = sprintf("%.10f", $value);
print $value # prints 1e-07, $value is a number
# /NOPE
use bignum;
$value = ($value+0)->bstr();
print $value; # prints 0.0000001, $value is a string
no bignum;
print $value; # prints 0.0000001, $value is a string
# HOORAY